将Seq [Option [T]]转换为Seq [T]

时间:2013-05-22 15:11:00

标签: scala null

我有一个Option[T]的集合,现在我想从中提取值。但我也希望新集合排除None s。

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

有没有更简单的方法来实现这种行为?

1 个答案:

答案 0 :(得分:24)

使用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)

和for-comprehension:

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)