2013-05-22 23 views
7

私はOption[T]のコレクションを持っていますが、ここから値を抽出したいと思います。しかし、新しいコレクションでNoneを除外したいと思っています。Seq [Option [T]]をSeq [T]に変換する

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 

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

+6

flatMap that shit :) –

答えて

22

使用flatten方法:

foo.flatMap(x => x) 

とについて、理解:

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方法もあり

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)