是否有可能让List[Option[T]]
的所有条目具有值?从斯卡拉的列表[选项]中获取所有具有值的条目
实施例:
val list = List(None, Some(1), None, Some(2))
list.filter(_.isDefined).map(_.get)
结果:
List[Int] = List(1, 2)
有做在一个步骤的方法?这是常见的情况,不是吗?
是否有可能让List[Option[T]]
的所有条目具有值?从斯卡拉的列表[选项]中获取所有具有值的条目
实施例:
val list = List(None, Some(1), None, Some(2))
list.filter(_.isDefined).map(_.get)
结果:
List[Int] = List(1, 2)
有做在一个步骤的方法?这是常见的情况,不是吗?
注意
list.flatten
会做一样好。
是的,你可以使用collect
为:
list.collect { case Some(x) => x }
collect
需要PartialFunction[A,B]
这个功能适用于在其上定义,并放弃其余的所有元素。
编辑:
由于gpampara正确提到的,对于这种情况下flatten
就足够了。 collect
如果有其他约束和/或转换,将是正确的工具。
您还可以使用:
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/
谢谢。你可以依靠斯卡拉总是有一个更优雅的方式;-) – deamon
一个更优雅的方式很简单:'list.flatten' – gpampara
@gpampara谢谢,你证明我是正确的:-) – deamon