如何从列表中滤除所有内容?


105

如果我List[Option[A]]在Scala中有一个,过滤None值的惯用方式是什么?

一种方法是使用以下方法:

val someList: List[Option[String]] = List(Some("Hello"), None, Some("Goodbye"))
someList.filter(_ != None)

还有更“惯用”的方式吗?这看起来确实很简单。


Answers:


161

如果要同时摆脱这些选项,可以使用flatten

scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)

23
我要补充一点的flatMap是,它可以用来处理Nones 以外的列表元素,类似于someList.flatten.map,因为人们经常想使用这些元素,而不仅仅是flatten处理列表。
Frank

是的,我很犹豫地问Raph,他对过滤后的清单有什么期望。但是,在很多情况下,您只想展平。
Nicolas

有时我想检索Option对象的内容,但有时我需要它们保持为Option[A]。我发现越来越多的用途Option[A]-很酷的功能。
拉夫

是否有等效的flatForeach类型方法?
cdmckay 2015年

1
如果您的收藏品是一成不变的,那么faltmap可以解决问题。如果您的收藏是可变的,不,没有。
Nicolas 2015年


2

cats库还具有flattenOption,可将任何内容F[Option[A]]转换为F[A](其中F[_]FunctorFilter

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.