Pregunta

estoy empezando a explorar Scala, y una de las cosas que estoy intrigado por Option es el tipo y la promesa de ser capaz de eliminar los errores relacionados null.

Sin embargo no he podido encontrar la manera de transformar una lista (u otra colección) de, por ejemplo, Option[String], a una colección de String (obviamente, el filtrado de los valores que estén None).

En otras palabras, ¿cómo puedo obtener de esto:

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

... a esto:

List[Int] = List(1)

Estoy usando Scala 2.8 si eso tiene algún impacto en la respuesta.

¿Fue útil?

Solución

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

Otros consejos

Para fines educativos, que le gustaría algunas alternativas:

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)

Con Scalaz, se puede realizar una operación ligeramente diferente llamado sequence, que vuelve 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))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top