Si j'ai un List[Option[A]]
dans Scala, quelle est la manière idiomatique de filtrer les valeurs None
?
Une façon consiste à utiliser ce qui suit:
val someList: List[Option[String]] = List(Some("Hello"), None, Some("Goodbye"))
someList.filter(_ != None)
Y a-t-il une manière plus "idiomatique"? Cela semble assez simple.
Si vous voulez vous débarrasser des options en même temps, vous pouvez utiliser flatten
:
scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)
someList.filter(_.isDefined)
si vous souhaitez conserver le type de résultat comme List[Option[A]]
La bibliothèque cats
possède également flattenOption
, ce qui transforme tout F[Option[A]]
dans un F[A]
(où F[_]
est un FunctorFilter
)
import cats.implicits._
List(Some(1), Some(2), None).flattenOption == List(1, 2)