20

是否可以获得List[Option[T]]具有值的所有条目?

例子:

val list = List(None, Some(1), None, Some(2))
list.filter(_.isDefined).map(_.get)

结果:

 List[Int] = List(1, 2)

有没有一种方法可以一步完成?这是一个常见的情况,不是吗?

4

3 回答 3

44

注意

 list.flatten

也会这样做。

于 2013-01-17T09:24:43.453 回答
10

是的,您可以使用collect

list.collect { case Some(x) => x }

collect接受 aPartialFunction[A,B]并将此函数应用于定义它的所有元素并丢弃其余元素。

编辑

正如 gpampara 正确提到的那样,对于这种情况flatten就足够了。collect如果有额外的限制和/或转换,将是正确的工具。

于 2013-01-17T09:01:39.777 回答
4

您还可以使用:

list.flatMap( x => x)

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

scala> a.flatMap(x => x)
res0: List[Int] = List(1, 2)

有关如何/为什么这样做的解释,您可以查看这篇文章:http ://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/

于 2013-01-17T09:13:16.913 回答