Scala: Как добавить значения соответствия в список значений - PullRequest
0 голосов
/ 18 марта 2020

У меня есть несколько значений, match для соответствующих значений

Вот пример:

 val job_ = Try(jobId.toInt) match {
      case Success(value) => jobs.findById(value).map(_.id)
        .getOrElse( Left(WrongValue("jobId", s"$value is not a valid job id")))
      case Failure(_) => jobs.findByName(jobId.toString).map(_.id)
        .getOrElse( Left(WrongValue("jobId", s"'$jobId' is not a known job title.")))
    }

// Здесь значение поступает в виде строки ei "yes || нет || true || или false ", затем преобразуется в логическое значение

val bool_ = bool.toLowerCase() match {
  case "yes" => true
  case "no" => false
  case "true" => true
  case "false" => false
  case other =>  Left(Invalid("bool", s"wrong value received"))
}

Примечание: неверный регистр case class Invalid(x: String, xx: String)

выше i ищу заданное значение задания и проверяю, существует ли оно в БД,

Нет, у меня есть несколько из них, и я хочу добавить их в список, вот мой список val и сплющить его:

val errors = List(..all my vals errors...).flatten // <--- my_list_val (how do I include val bool_ and val job_)

if (errors.isEmpty) { do stuff }

Мой результат должен содержать ошибки от val bool_ и val job_

СПАСИБО!

Ответы [ 3 ]

1 голос
/ 18 марта 2020

Сначала нужно исправить типы. Тип bool_ равен Any. Что не дает вам того, с чем вы можете работать.

Если вы хотите использовать Either, вам нужно использовать его везде.

Тогда самый простой подход - использовать для понимание (я предполагаю, что вы имеете дело с Either[F, T] здесь, где WrongValue и Invalid являются подклассами F, и вы не очень заинтересованы в ошибках).

for {
  foundJob <- job_
  _ <- bool_
} yield {
  // do stuff
}

Обратите внимание, что в Scala> = 2.13 вы можете использовать toIntOption при преобразовании строки в Int:

vaj job_: Either[F, T] = jobId.toIntOption match {
  case Some(value) =>  ...
  case _ => ...
}

Кроме того, в случае выражений вы можете использовать альтернативы, когда вы иметь одно и то же утверждение для нескольких случаев:

val bool_: Either[F, Boolean] = bool.toLowerCase() match {
  case "yes" | "true"  => Right(true)
  case "no"  | "false" => Right(false)
  case other =>  Left(Invalid("bool", "wrong value received"))
}
0 голосов
/ 18 марта 2020

Итак, согласно вашему вопросу и вашим комментариям, это те типы, с которыми вы имеете дело.

type ID = Long //whatever id is
def WrongValue(x: String, xx: String) :String = "?-?-?"
case class Invalid(x: String, xx: String)

Теперь давайте создадим пару значений ошибок.

val job_  :Either[String,ID]       = Left(WrongValue("x","xx"))
val bool_ :Either[Invalid,Boolean] = Left(Invalid("x","xx"))

Чтобы объединить и сообщить о них, вы можете сделать что-то вроде этого.

val errors :List[String] =
  List(job_, bool_).flatMap(_.swap.toOption.map(_.toString))

println(errors.mkString(" & "))
//?-?-? & Invalid(x,xx)
0 голосов
/ 18 марта 2020

После проверки типов, как объяснил @cbley. Вы можете просто выполнить операцию фильтра с сопоставлением с шаблоном в своем списке:

val error = List(// your variables ).filter(_ match{
  case Left(_) => true
  case _ => false
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...