¿Cómo filtrar Ninguno fuera de la lista [Opción]?

105

Si tengo un List[Option[A]]en Scala, ¿cuál es la forma idiomática de filtrar los Nonevalores?

Una forma es utilizar lo siguiente:

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

¿Existe una forma más "idiomática"? Esto parece bastante simple.

Ralph
fuente

Respuestas:

161

Si desea deshacerse de las opciones al mismo tiempo, puede usar flatten:

scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)
Nicolas
fuente
23
Yo agregaría que flatMapse puede usar para procesar los elementos de la lista distintos de Nones, similar a someList.flatten.map, ya que a menudo se quiere trabajar con estos elementos y no solo con flattenla lista por diversión.
Frank
Sí, dudé en preguntarle a Raph qué esperaba hacer con la lista filtrada. Pero también hay muchos escenarios en los que solo desea aplanar.
Nicolas
A veces quiero recuperar el contenido de los Optionobjetos, pero otras veces necesito que permanezcan como Option[A]. Cada vez encuentro más usos para esta Option[A]característica interesante.
Ralph
¿Existe un método de tipo flatForeach equivalente?
cdmckay
1
Si su colección es inmutable, faltmap funcionará. Si tu colección es mutable, no, no la hay.
Nicolas
18

someList.filter(_.isDefined) si desea mantener el tipo de resultado como List[Option[A]]

Kevin O'Riordan
fuente
2

La catsbiblioteca también tiene flattenOption, que convierte any F[Option[A]]en un F[A](donde F[_]es un FunctorFilter)

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
dcastro
fuente