Как отфильтровать None из списка[опция]?


Если у меня есть List[Option[A]] в Scala, что такое идиоматические способ, чтобы отфильтровать None значения?

один из способов заключается в использовании следующего:

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

есть ли более "идиоматический" способ? Это действительно кажется довольно простым.

3 85

3 ответа:

Если вы хотите избавиться от опций одновременно, вы можете использовать flatten:

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

someList.filter(_.isDefined) Если вы хотите сохранить тип результата как List[Option[A]]

The cats библиотеке flattenOption, которая превращает любой F[Option[A]] на F[A] (где F[_] это FunctorFilter)

import cats.implicits._

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

по состоянию на cats 1.0, эта функция была перенесена на FunctorEmpty на cats-mtl-core библиотека, так что вам понадобится:

import cats.mtl.implicits._