基本上我想提取一堆選項a,b等。這是在斯卡拉這樣做的最好方法嗎?對於我來說,在括號中有收益率,這看起來有些令人困惑。是爲了yield-getOrElse範式Scala還是有更好的方法?
(for {
a <- a
b <- b
c <- c
...
} yield {
...
}) getOrElse {
...
}
基本上我想提取一堆選項a,b等。這是在斯卡拉這樣做的最好方法嗎?對於我來說,在括號中有收益率,這看起來有些令人困惑。是爲了yield-getOrElse範式Scala還是有更好的方法?
(for {
a <- a
b <- b
c <- c
...
} yield {
...
}) getOrElse {
...
}
嘗試使用map
和flatMap
代替。假設你有下面的類層次結構:
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
。
所以會有一個flatMaps /地圖鏈? (加雷特寫了'...'所以我猜想會有兩個以上的選項) –
對於c,d等等呢?哪些是範例,如果Scala中有這樣的事情? –
@ om-nom-nom:我重新編寫了我的示例,以清楚地指出鏈接是如何實現的。 –
看起來你不會比* core * scala更好,但是可能你可以[嘗試scalaz](http://www.casualmiracles.com/2012/01/16/a-small - 實例-的,應用性,仿函數與 - scalaz /)? –
scalaz示例並沒有真正處理這種情況,而是使用3個獨立的選項;這裏的問題是關於嵌套的選項;我錯過了什麼嗎? –
我認爲用parens包裹的for-comprehension沒有什麼問題,它像其他任何表達一樣。我一直這樣做。 –