返回数据时如何检查无

时间:2018-12-16 07:15:58

标签: scala akka akka-http

我正在这样获取数据

 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 :(得分:2)

如果要处理的值可能为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))
}