Как проверить None при возврате данных - PullRequest
0 голосов
/ 16 декабря 2018

Я получаю свои данные следующим образом

 case class MyClass(s: Option[Safe] = None, t: Option[Threat] = None)

        val myCheck = for {
          t <- fT
          s <- fS
        } yield MyClass(s, t)

        onComplete(myCheck) {
          case Success(check) =>
            check match {
              case (maybeMyClass) =>
                complete(ToResponseMarshallable(maybeMyClass))
            }

Это хорошо работает, когда мои записи найдены, однако, когда записи не найдены, я получаю MyClass(None, None).Я хотел бы поймать это, используя сопоставление с шаблоном и бросить соответствующее сообщение.Как я могу использовать сопоставление с образцом здесь, чтобы поймать, когда данные null?

1 Ответ

0 голосов
/ 16 декабря 2018

Если вы имеете дело со значениями, которые могут быть null, важно обернуть их, используя Option.Объект Option проверит null значения и вернет None.

Однако, используя Some, не проверит null, и вы можете получить Some(null).

Если у вас есть опция, которая может быть Some(null), вы можете очистить ее, снова обернув ее в Option, используя flatMap(Option(_))

Например:

val s: String = "x"
val n: String = null

Option(s) // Some("x")
Option(n) // None
Some(s)   // Some("x")
Some(n)   // Some(null) <- NB

Some(n).flatMap(Option(_)) // None

Обновление после комментариев

Из комментариев видно, что null на самом деле находится в JSON и предположительно происходит от анализа None, а не от Scala null.В этом случае вы можете просто проверить None как обычно:

check match {
  case MyClass(None, _) =>
    // Error: missing Safe value
  case MyClass(_, None) =>
    // Error: missing Threat value
  case _ =>
    complete(ToResponseMarshallable(check))
}
...