scala 如何筛选不在列表[选项]之外的内容?

daupos2t  于 2022-11-09  发布在  Scala
关注(0)|答案(4)|浏览(166)

如果我在Scala中有一个List[Option[A]],那么筛选出None值的惯用方法是什么?
一种方法是使用以下方法:

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

有没有更“惯用”的方法?这看起来确实很简单。

q9yhzks0

q9yhzks01#

如果您想同时去掉这些选项,可以使用flatten

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

xxls0lw82#

如果要将结果类型保留为List[Option[A]],则为someList.filter(_.isDefined)

2o7dmzc5

2o7dmzc53#

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

import cats.implicits._

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

hjzp0vay4#

如果您有一个比字符串更复杂的对象的选项列表,如下所示:

case class Thing(name: String, number: Int)

val someSequence: Seq[Option[Thing]] = Seq(
  Some(Thing("Hello", 1)),
  None,
  Some(Thing("Goodbye", 2)),
  None
)

您可以使用Flat Map来链接内部值的Map:

scala> someSequence.flatMap(_.map(_.name))
val res2: Seq[String] = List(Hello, Goodbye)

但在我看来,@Nicolas上面的回答更简洁,因为你可以做到:

scala> someSequence.flatten.map(_.name)
val res3: Seq[String] = List(Hello, Goodbye)

相关问题