我正在使用scala,最近继承了一些需要嫁接的Java代码,不幸的是在Scala中重写它不在卡片中.它有一个深层嵌套的对象结构,任何级别都可以为null.通常我只关心嵌套内的深层价值.
理想情况下,我会做这样的事情:
Option(foo.blah.blarg.doh)
Run Code Online (Sandbox Code Playgroud)
但是如果foo.blah.blarg中的任何一个为null,则会生成NPE.
现在我已经把它包装成了一个尝试:
Try(Option(foo.blah.blarg.doh)).getOrElse(None)
Run Code Online (Sandbox Code Playgroud)
请注意,使用.toOption不能正常工作,因为如果链的最后一位为空,它可能会导致Some(null).
我不是特别喜欢这种结构,还有其他任何想法吗?
flatMap它:
for {
a <- Option(foo)
b <- Option(a.blah)
c <- Option(b.blarg)
d <- Option(c.doh)
} yield d
Run Code Online (Sandbox Code Playgroud)
利用按名称参数构建您自己的构造:
def handleNull[T](x: => T): Option[T] = try Option(x) catch {
case _: NullPointerException => None
}
handleNull(foo.blah.blarg.doh)
Run Code Online (Sandbox Code Playgroud)