如何包装java方法响应以处理空值

时间:2016-12-23 19:40:23

标签: scala

我有一个当前返回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")
}

用户最终为空。

4 个答案:

答案 0 :(得分:3)

您可以向Success添加一个检查null的保护:

val maybeUser = Try(userService.getUser) match {
  case Success(u) if u != null => u
  case _ => None
}

您可以使用filtergetOrElse

缩短时间
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.Serializablecase 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