我对Scala还是很陌生,但我仍在尝试适应语法和样式,因此这可能是一个非常简单的问题。

我正在使用一个代码库,其中有很多用Option填充的案例类,如下所示:

case class Person(
  pants: Option[Pants]
)
case class Pants(
  pocket: Option[Pocket]
)
case class Pocket(
  cash: Option[Cash]
)
case class Cash(
  value: String = "zilch"
)

在上面的示例中,如果他们确实穿着裤子……有口袋,并且根本没有钱,那么如何返回PersonPants Pocket中有多少钱?

最佳答案

for-comprehensions的美好时光:

val someCash: Option[Cash] =
   for( pants  <- somePerson.pants;
        pocket <- pants.pocket;
        cash   <- pocket.cash ) yield cash

同样,您可以编写以下内容,其中第一个代码是语法糖(忽略一些微妙之处):
val someCash: Option[Cash] =
   somePerson.pants.flatMap(_.pocket.flatMap(_.cash))

(我不完全确定您是否可以像我一样使用_通配符编写最后一个表达式)。

10-08 16:01