¿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.


Respuestas:


161

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

scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)

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]]


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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.