映射Option的null结果的简明方法

Nat*_*ate 1 scala

假设我有一些课程B和一些A我无法控制的课程:

class B
class A { def getB: B = ... }
Run Code Online (Sandbox Code Playgroud)

有时结果getB是有效的B,有时是null.我有一个可选项A,我希望得到一个可选项B.这是我可以弄清楚如何做到的"最简单"方式:

val a: Option[A] = ...
val b: Option[B] = a flatMap {x => Option(x.getB)}
Run Code Online (Sandbox Code Playgroud)

我想摆脱名字x,所以我尝试了这个,这并不简单:

val b: Option[B] = a map {_.getB} flatMap Option.apply
Run Code Online (Sandbox Code Playgroud)

我试着作曲_.getBOption,和我工作的唯一的另一件事是不太简单:

val b: Option[B] = a flatMap {((x: A) => x.getB) andThen Option.apply _}
Run Code Online (Sandbox Code Playgroud)

什么是更简单的方法?这似乎是一个普遍的问题,有一个优雅的解决方案.我真正想要的是接近这一点,这显然是不可能的:

val b: Option[B] = a flatMap {Option(_.getB)}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ric 6

没有办法让它更简洁,但你可以使用"丰富我的库"模式来添加你自己的功能A,比如一个叫做safeGetB你想要的方法:

scala> :pa
// Entering paste mode (ctrl-D to finish)

class B
class A {
  def getB: B = null
}

implicit class RichA(a: A) {
  def safeGetB: Option[B] = Option(a.getB)
}

Some(new A()).flatMap(_.safeGetB)

// Exiting paste mode, now interpreting.

defined class B
defined class A
defined class RichA
res0: Option[B] = None
Run Code Online (Sandbox Code Playgroud)