如何从 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
可用于处理None
s 以外的列表元素,类似于someList.flatten.map
,因为人们经常想要使用这些元素而不仅仅是@987654326 @列表出于好玩。
是的,我很犹豫地问 Raph 他希望对过滤后的列表做什么。但也有很多场景你只想扁平化。
有时我想检索Option
对象的内容,但有时我需要它们保持为Option[A]
。我发现Option[A]
的用途越来越多——很酷的功能。
有等效的 flatForeach 类型方法吗?
如果你的集合是不可变的,faltmap 可以解决问题。如果你的集合是可变的,不,没有。以上是关于如何从 List[Option] 中过滤掉 None?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Youtube 播放列表 API 中过滤掉不可嵌入的视频
Lab: File path traversal, traversal sequences stripped non-recursively 文件路径遍历,遍历非递归过滤的语句