基本上我想提取一堆选项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没有什么问题,它像其他任何表达一样。我一直这样做。 –