我有一个当前返回null的java方法。
val maybeUser = Try(userService.getUser) match {
case Success(u) => u
case _ => None
}
然后当我访问maybeUser时,我得到一个空值:
val user = maybeUser match {
case Some(u) => u
case _ => User(1, "hello")
}
用户最终为空。
答案 0 :(得分:3)
您可以向Success
添加一个检查null
的保护:
val maybeUser = Try(userService.getUser) match {
case Success(u) if u != null => u
case _ => None
}
您可以使用filter
和getOrElse
:
val user = Try(userService.getUser)
.filter(user => user != null)
.getOrElse(User(1, "hello"))
答案 1 :(得分:3)
如果您确定您的函数没有抛出任何异常,那么您可以使用Option
伴随对象来处理空值。
Option(userService.getUser)
选项的apply方法取空值并将其转换为None,然后你可以进行模式匹配。
scala> Option(null)
res0: Option[Null] = None
如果您怀疑您的方法调用可能抛出异常,请执行
Option(Try(userService.getUser).getOrElse(null))
然后模式匹配
答案 2 :(得分:1)
另一种将Try与选项结合起来的方法;)
Try(userService.getUser).toOption.flatMap(Option(_)) match {
case Some(user) => user
case None => User(1, "hello")
}
然而,我发现自己经常做的事情是编写自己的提取器:
class NotNull[+A <: AnyRef](private val underlying: A) extends AnyVal {
def get: A = underlying
def isEmpty: Boolean = get == null
}
object NotNull {
def unapply[A <: AnyRef](a: A): NotNull[A] = NotNull(a)
}
然后可以像:
一样使用Try(userService.getUser) match {
case Success(NotNull(user)) => user
case _ => User(1, "hello")
}
答案 3 :(得分:0)
这看起来很可疑,除非有拼写错误:在case Success(u) => u
中你没有返回Option
,只是User
(假设你的Java方法没有?)返回Scala Option
;如果确实如此,也可以返回null
,那么您的设计会遇到更大的问题)。因此,maybeUser
的类型很可能是AnyRef
,也可能是java.lang.Serializable
,case Some(u)
永远不会匹配,user
永远是User(1, "hello")
。
如果 是一个拼写错误而且你有case Success(u) => Some(u)
:没有理由在Try
上匹配只是为了在同样的两种情况下再次匹配结果处理。只需结合匹配:
val user = Try(userService.getUser) match {
case Success(u) if u != null =>
u
case _ =>
User(1, "hello")
}
除非您不止一次使用maybeUser
。