从Scala中的List [Option]获取具有值的所有条目

dea*_*mon 16 collections functional-programming scala

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

例:

val list = List(None, Some(1), None, Some(2))
list.filter(_.isDefined).map(_.get)
Run Code Online (Sandbox Code Playgroud)

结果:

 List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)

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

Fai*_*aiz 32

注意

 list.flatten
Run Code Online (Sandbox Code Playgroud)

也会这样做.


dre*_*xin 7

是的,您可以使用collect:

list.collect { case Some(x) => x }
Run Code Online (Sandbox Code Playgroud)

collect获取a PartialFunction[A,B]并将此函数应用于定义它的所有元素,并丢弃其余元素.

编辑:

正如gpampara正确提到的,对于这种情况flatten就足够了.collect如果有额外的约束和/或转换,它将是正确的工具.

  • 更优雅的方式就是:`list.flatten` (2认同)