如果我在Scala中有一个List[Option[A]],那么筛选出None值的惯用方法是什么?一种方法是使用以下方法:
List[Option[A]]
None
val someList: List[Option[String]] = List(Some("Hello"), None, Some("Goodbye")) someList.filter(_ != None)
有没有更“惯用”的方法?这看起来确实很简单。
q9yhzks01#
如果您想同时去掉这些选项,可以使用flatten:
flatten
scala> someList.flatten res0: List[String] = List(Hello, Goodbye)
xxls0lw82#
如果要将结果类型保留为List[Option[A]],则为someList.filter(_.isDefined)
someList.filter(_.isDefined)
2o7dmzc53#
cats库还有flattenOption,它将任何F[Option[A]]转换为F[A](其中F[_]是FunctorFilter)
cats
flattenOption
F[Option[A]]
F[A]
F[_]
FunctorFilter
import cats.implicits._ List(Some(1), Some(2), None).flattenOption == List(1, 2)
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)
4条答案
按热度按时间q9yhzks01#
如果您想同时去掉这些选项,可以使用
flatten
:xxls0lw82#
如果要将结果类型保留为
List[Option[A]]
,则为someList.filter(_.isDefined)
2o7dmzc53#
cats
库还有flattenOption
,它将任何F[Option[A]]
转换为F[A]
(其中F[_]
是FunctorFilter
)hjzp0vay4#
如果您有一个比字符串更复杂的对象的选项列表,如下所示:
您可以使用Flat Map来链接内部值的Map:
但在我看来,@Nicolas上面的回答更简洁,因为你可以做到: