2013-05-22 50 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) 
相关问题