web-dev-qa-db-fra.com

Comment filtrer aucun de la liste [Option]?

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.

96
Ralph

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)
152
Nicolas

someList.filter(_.isDefined) si vous souhaitez conserver le type de résultat comme List[Option[A]]

16
Kevin O'Riordan

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)
2
dcastro