74 votes

Comment transformer en Scala la collection d'Option[X] en collection de X

Je commence à explorer Scala, et l'une des choses qui m'intriguent est la fonction Option et la promesse d'être en mesure d'éliminer null erreurs liées.

Cependant, je n'ai pas réussi à trouver comment transformer une liste (ou une autre collection) de, disons, Option[String] à une collection de String (en filtrant évidemment toutes les valeurs qui sont None ).

En d'autres termes, comment puis-je en venir à ça :

List[Option[Int]] = List(Some(1))

... à ceci :

List[Int] = List(1)

J'utilise Scala 2.8 si cela a un impact sur la réponse.

130voto

Madoc Points 3217
val list1 = List(Some(1), None, Some(2))
val list2 = list1.flatten // will be: List(1,2)

57voto

retronym Points 35066

À des fins éducatives, vous pourriez apprécier certaines alternatives :

scala> val list1 = List(Some(1), None, Some(2))
list1: List[Option[Int]] = List(Some(1), None, Some(2))

scala> list1 flatten
res0: List[Int] = List(1, 2)

// Expanded to show the implicit parameter
scala> list1.flatten(Option.option2Iterable)
res1: List[Int] = List(1, 2)

scala> list1 flatMap (x => x)
res2: List[Int] = List(1, 2)

scala> list1 flatMap Option.option2Iterable
res3: List[Int] = List(1, 2)

// collect is a simultaneous map + filter
scala> list1 collect { case Some(x) => x }
res4: List[Int] = List(1, 2)

Avec Scalaz, vous pouvez effectuer une opération légèrement différente appelée sequence qui renvoie Option[List[Int]] .

scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._

scala> val list1: List[Option[Int]] = List(Some(1), None, Some(2)) 
list1: List[Option[Int]] = List(Some(1), None, Some(2))

scala> list1.sequence                                              
res1: Option[List[Int]] = None

scala> val list2: List[Option[Int]] = List(Some(1), Some(2))         
list2: List[Option[Int]] = List(Some(1), Some(2))

scala> list2.sequence
res2: Option[List[Int]] = Some(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