我正在这样获取数据
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
时,如何在此处使用模式匹配来捕获?
答案 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))
}