129 votes

Comment filtrer les None's de la liste [Option] ?

Si j'ai un List[Option[A]] en Scala, quelle est la façon idiomatique de filtrer les éléments suivants None valeurs ?

Une façon de procéder est d'utiliser ce qui suit :

val someList: List[Option[String]] = List(Some("Hello"), None, Some("Goodbye"))
someList.filter(_ != None)

Existe-t-il un moyen plus "idiomatique" ? Cela semble assez simple.

1 votes

194voto

Nicolas Points 11558

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)

30 votes

J'ajouterais que flatMap peut être utilisé pour traiter les éléments de la liste autres que None similaire à someList.flatten.map car on souhaite souvent travailler avec ces éléments et non pas seulement avec les autres. flatten la liste par plaisir.

0 votes

Oui, j'ai hésité à demander à Raph ce qu'il compte faire avec la liste filtrée. Mais il y a aussi beaucoup de scénarios où l'on veut juste aplatir.

0 votes

Parfois, je veux récupérer le contenu du fichier Option objets, mais d'autres fois, j'ai besoin qu'ils restent en tant que Option[A] . Je trouve de plus en plus d'utilisations pour Option[A] -- fonctionnalité cool.

22voto

Kevin O'Riordan Points 199

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

5voto

dcastro Points 17978

El cats La bibliothèque dispose également flattenOption 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X