7

基本上我想提取一堆选项 a、b 等。这是在 Scala 中执行此操作的最佳方法吗?括号中的 for-yield 让我有点困惑。

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

1 回答 1

6

尝试使用mapandflatMap代替。假设您具有以下类层次结构:

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调用。

于 2012-10-04T20:45:58.920 回答