2012-10-04 34 views
6

基本上我想提取一堆选项a,b等。这是在斯卡拉这样做的最好方法吗?对于我来说,在括号中有收益率,这看起来有些令人困惑。是为了yield-getOrElse范式Scala还是有更好的方法?

(for { 
    a <- a 
    b <- b 
    c <- c 
    ... 
} yield { 
    ... 
}) getOrElse { 
    ... 
} 
+2

看起来你不会比* core * scala更好,但是可能你可以[尝试scalaz](http://www.casualmiracles.com/2012/01/16/a-small - 实例-的,应用性,仿函数与 - scalaz /)? –

+0

scalaz示例并没有真正处理这种情况,而是使用3个独立的选项;这里的问题是关于嵌套的选项;我错过了什么吗? –

+0

我认为用parens包裹的for-comprehension没有什么问题,它像其他任何表达一样。我一直这样做。 –

回答

6

尝试使用mapflatMap代替。假设你有下面的类层次结构:

case class C(x: Int) 
case class B(c: Option[C]) 
case class A(b: Option[B]) 

val a = Some(A(Some(B(Some(C(42)))))) 

为了提取42你可以说:

a.flatMap(_.b).flatMap(_.c).map(_.x).getOrElse(-1) 

这大致相当于:

for(
    a <- a 
    b <- a.b 
    c <- b.c) 
     yield c.x 

只不过它返回Some(42)。实际上for的理解实际上被翻译成调用序列map/flatMap

+0

所以会有一个flatMaps /地图链? (加雷特写了'...'所以我猜想会有两个以上的选项) –

+0

对于c,d等等呢?哪些是范例,如果Scala中有这样的事情? –

+0

@ om-nom-nom:我重新编写了我的示例,以清楚地指出链接是如何实现的。 –

相关问题