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.


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)

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]]


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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.