2016-12-23 34 views
1

我有一个当前返回null的java方法。如何包装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") 
} 

用户最终被空。

回答

3

可以保护添加到Success其检查null

val user = Try(userService.getUser) 
      .filter(user => user != null) 
      .getOrElse(User(1, "hello")) 
3

如果你确信你的功能不:

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

您可以通过使用filtergetOrElse使这个短抛出任何异常,然后使用Option伴随对象来处理空值。

Option(userService.getUser) 

选项的apply方法取空值并将其转换为None,然后您可以继续进行模式匹配。

scala> Option(null) 
res0: Option[Null] = None 

如果你怀疑你的方法调用可能会抛出一个异常,然后做

Option(Try(userService.getUser).getOrElse(null)) 

然后模式匹配

1

而另一种方式来组合与选择尝试;)

Try(userService.getUser).toOption.flatMap(Option(_)) match { 
    case Some(user) => user 
    case None  => User(1, "hello") 
} 

但是,我发现m yself做更多的往往不是,是我自己写的提取:

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") 
} 
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只是为了您刚刚处理相同2箱子再次匹配的结果。只要结合匹配:

val user = Try(userService.getUser) match { 
    case Success(u) if u != null => 
    u 
    case _ => 
    User(1, "hello") 
} 

,除非你要使用超过一次maybeUser更多。