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

时间:2017-02-06 20:09:20

标签: scala

说我有一些课程B和一些我无法控制的课程A

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

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

val a: Option[A] = ...
val b: Option[B] = a flatMap {x => Option(x.getB)}

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

val b: Option[B] = a map {_.getB} flatMap Option.apply

我尝试用_.getB撰写Option,而我唯一能做的工作就不那么简单了:

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

什么是更简单的方法?这似乎是一个普遍的问题,有一个优雅的解决方案。我真正喜欢拥有的东西是接近于此的东西,这显然是不可能的:

val b: Option[B] = a flatMap {Option(_.getB)}

1 个答案:

答案 0 :(得分: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