返回数据时如何检查 None

How to check for None when returning data

我正在这样获取我的数据

 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?

时,如何在此处使用模式匹配来捕获

如果您处理的值可能是 null,使用 Option 包装它们很重要。 Option 对象将检查 null 值和 return None.

但是,使用 Some 不会 检查 null 并且您可以获得 Some(null).

如果您有一个可能是 Some(null) 的选项,您可以通过使用 flatMap(Option(_))

再次将其包装在 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))
}