Scala 2.7.7 の使用:
オプションのリストがある場合、for-comprehension を使用してそれらをフラット化できます。
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)
...しかし、オプションをリストに変換する必要はありません。それは不格好に思えます。
何かアドバイス?