假设我有一些课程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)
我试着作曲_.getB用Option,和我工作的唯一的另一件事是不太简单:
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)
没有办法让它更简洁,但你可以使用"丰富我的库"模式来添加你自己的功能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)
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |