说我有一些课程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)}
答案 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