如何过滤列表[选项]中的无?

Ral*_*lph 99 scala option

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

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

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

有更"惯用"的方式吗?这看起来很简单.

Nic*_*las 154

如果您想同时删除选项,可以使用flatten:

scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)
Run Code Online (Sandbox Code Playgroud)

  • 我想补充一点,`flatMap`可以用来处理除``s之外的列表元素,类似于`someList.flatten.map`,因为人们经常想要使用这些元素,而不仅仅是'展平'列表好玩 (22认同)

小智 16

someList.filter(_.isDefined) 如果你想保持结果类型为 List[Option[A]]


dca*_*tro 5

cats文库还具有flattenOption,这将任何F[Option[A]]进入的F[A](其中,F[_]FunctorFilter

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
Run Code Online (Sandbox Code Playgroud)