2012-10-04 67 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:我重新編寫了我的示例,以清楚地指出鏈接是如何實現的。 –

相關問題