Comment filtrer Aucun de la liste [Option]?

105

Si j'ai un List[Option[A]]dans Scala, quelle est la manière idiomatique de filtrer les Nonevaleurs?

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.

Ralph
la source

Réponses:

161

Si vous souhaitez vous débarrasser des options en même temps, vous pouvez utiliser flatten:

scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)
Nicolas
la source
23
J'ajouterais que cela flatMappeut être utilisé pour traiter les éléments de liste autres que Nones, similaire à someList.flatten.map, car on veut souvent travailler avec ces éléments et pas seulement flattenla liste par amusement.
Frank
Oui, j'ai hésité à demander à Raph ce qu'il attend de la liste filtrée. Mais il existe également de nombreux scénarios dans lesquels vous souhaitez simplement aplatir.
Nicolas
Parfois, je veux récupérer le contenu des Optionobjets, mais d'autres fois, j'ai besoin qu'ils restent comme Option[A]. Je trouve de plus en plus d'utilisations pour Option[A]- fonctionnalité intéressante.
Ralph
Existe-t-il une méthode de type flatForeach équivalente?
cdmckay
1
Si votre collection est immuable, faltmap fera l'affaire. Si votre collection est mutable, non, il n'y en a pas.
Nicolas
18

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

Kevin O'Riordan
la source
2

La catsbibliothèque a également flattenOption, qui transforme tout F[Option[A]]en un F[A](où F[_]est a FunctorFilter)

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
dcastro
la source