2013-05-22 49 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那狗屎:) –

回答

22

使用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) 
相關問題