使用 Scala 2.7.7:
如果我有一个选项列表,我可以使用理解将它们展平:
val listOfOptions = List(None, Some("hi"), None)
listOfOptions: List[Option[java.lang.String]] = List(None, Some(hi), None)
scala> for (opt <- listOfOptions; string <- opt) yield string
res0: List[java.lang.String] = List(hi)
我不喜欢这种风格,宁愿使用 HOF。这种尝试过于冗长而无法接受:
scala> listOfOptions.flatMap(opt => if (opt.isDefined) Some(opt.get) else None)
res1: List[java.lang.String] = List(hi)
直觉上我会期望以下工作,但它没有:
scala> List.flatten(listOfOptions)
<console>:6: error: type mismatch;
found : List[Option[java.lang.String]]
required: List[List[?]]
List.flatten(listOfOptions)
即使以下似乎也应该有效,但没有:
scala> listOfOptions.flatMap(_: Option[String])
<console>:6: error: type mismatch;
found : Option[String]
required: (Option[java.lang.String]) => Iterable[?]
listOfOptions.flatMap(_: Option[String])
^
我能想到的最好的是:
scala> listOfOptions.flatMap(_.toList)
res2: List[java.lang.String] = List(hi)
...但我宁愿不必将选项转换为列表。这似乎很笨拙。
有什么建议吗?