如何从 List[Option] 中过滤掉 None?

Posted

技术标签:

【中文标题】如何从 List[Option] 中过滤掉 None?【英文标题】:How to filter None's out of List[Option]? 【发布时间】:2012-04-23 16:14:14 【问题描述】:

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

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

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

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

【问题讨论】:

相关:***.com/questions/4730842/… 【参考方案1】:

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

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)

【讨论】:

为什么猫会在 std 库中的 flatten 完成这项工作时添加这个?它是在做一些额外的事情吗? @Mojo cat 版本更通用,因为它为任何类型提供了此功能,可以为其定义 FunctorFilter 类型类(例如,cats 为地图提供了这样的实例,因此您可以使用它在Map[A, Option[B] 上,标准库中没有flatten【参考方案2】:

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

【讨论】:

【参考方案3】:

如果你想同时去掉选项,可以使用flatten

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

【讨论】:

我要补充一点,flatMap 可用于处理Nones 以外的列表元素,类似于someList.flatten.map,因为人们经常想要使用这些元素而不仅仅是@987654326 @列表出于好玩。 是的,我很犹豫地问 Raph 他希望对过滤后的列表做什么。但也有很多场景你只想扁平化。 有时我想检索Option 对象的内容,但有时我需要它们保持为Option[A]。我发现Option[A] 的用途越来越多——很酷的功能。 有等效的 flatForeach 类型方法吗? 如果你的集合是不可变的,faltmap 可以解决问题。如果你的集合是可变的,不,没有。

以上是关于如何从 List[Option] 中过滤掉 None?的主要内容,如果未能解决你的问题,请参考以下文章

过滤掉所有其他选项时显示隐藏的 mat-option

如何过滤任意结果的查询?

如何从 Youtube 播放列表 API 中过滤掉不可嵌入的视频

Lab: File path traversal, traversal sequences stripped non-recursively 文件路径遍历,遍历非递归过滤的语句

如何从 pyspark.rdd.PipelinedRDD 中过滤掉值?

如何使用 $lte 从 json 中过滤掉字符串值