【问题标题】:How to filter None's out of List[Option]?如何从 List[Option] 中过滤掉 None?
【发布时间】: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)

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

【问题讨论】:

标签: scala option


【解决方案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 可以解决问题。如果你的集合是可变的,不,没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2018-09-02
    • 2018-01-28
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多