在scala中处理嵌套可空对象的习惯方法?

geo*_*try 4 scala

我正在使用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).

我不是特别喜欢这种结构,还有其他任何想法吗?

kir*_*uku 5

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)


win*_*ner 4

利用按名称参数构建您自己的构造:

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)