7

のコレクションがありOption[T]、そこから値を抽出したいと考えています。しかし、新しいコレクションで s を除外することも必要ですNone

val foo = List(None, None, Some(1), None, Some(2))

最初に頭に浮かんだアイデアは ですがmap、少し直感的ではありません。

foo.map(o => o.get) // Exception!
foo.map(o => o.getOrElse(null)).filterNot(_ == null) // List(1, 2), works but not elegant

この動作を実現する簡単な方法はありますか?

4

1 に答える 1

25

使用flatten方法:

scala> val foo = List(None, None, Some(1), None, Some(2))
foo: List[Option[Int]] = List(None, None, Some(1), None, Some(2))

scala> foo.flatten
res0: List[Int] = List(1, 2)

完全にするために、 flatMap メソッドもあります。

foo.flatMap(x => x)

そして理解のために:

scala> for(optX <- foo; x <- optX) yield x
res1: List[Int] = List(1, 2)

そして収集します(フィルター+マップのように機能します):

scala> foo.collect { case Some(x) => x } 
res2: List[Int] = List(1, 2)
于 2013-05-22T15:12:53.700 に答える