Comment transformer la collection Scala d’Option en collection de X

Je commence à explorer Scala, et l’une des choses qui m’insortinggue est le type Option et la promesse de pouvoir éliminer les erreurs liées à la null .

Cependant, je n’ai pas été capable de déterminer comment transformer une liste (ou une autre collection) de, par exemple, Option[Ssortingng] , en une collection de Ssortingng (en filtrant évidemment toutes les valeurs None ).

En d’autres termes, comment puis-je obtenir de cela:

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

… pour ça:

 List[Int] = List(1) 

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

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

À des fins éducatives, vous pourriez aimer quelques 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))