【发布时间】: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 中有一个 List[Option[A]],那么过滤掉 None 值的惯用方法是什么?
一种方法是使用以下方法:
val someList: List[Option[String]] = List(Some("Hello"), None, Some("Goodbye"))
someList.filter(_ != None)
还有更“惯用”的方式吗?这看起来很简单。
【问题讨论】:
cats 库还具有 flattenOption,它将任何 F[Option[A]] 转换为 F[A](其中 F[_] 是 FunctorFilter)
import cats.implicits._
List(Some(1), Some(2), None).flattenOption == List(1, 2)
【讨论】:
FunctorFilter 类型类(例如,cats 为地图提供了这样的实例,因此您可以使用它在Map[A, Option[B] 上,标准库中没有flatten)
someList.filter(_.isDefined)如果你想保持结果类型为List[Option[A]]
【讨论】:
如果你想同时去掉选项,可以使用flatten:
scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)
【讨论】:
flatMap 可用于处理Nones 以外的列表元素,类似于someList.flatten.map,因为人们经常想要使用这些元素而不仅仅是@987654326 @列表出于好玩。
Option 对象的内容,但有时我需要它们保持为Option[A]。我发现Option[A] 的用途越来越多——很酷的功能。