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.