2012-04-11 6 views
75

Si tengo un List[Option[A]] en Scala, ¿cuál es la forma idiomática de filtrar los valores None?Cómo filtrar ninguno fuera de la lista [Opción]?

Una forma es utilizar los siguientes:

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

¿Hay una manera más "idiomática"? Esto parece bastante simple.

+1

relacionadas: https: // stackoverflow.com/questions/4730842/how-to-transform-scala-collection-of-optionx-to-collection-of-x – dskrvk

Respuesta

120

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

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

Añadiría que 'flatMap' se puede usar para procesar los elementos de la lista que no sean' None' s, similar a 'someList.flatten.map', ya que a menudo uno quiere trabajar con estos elementos y no simplemente 'aplanar' la lista de la diversión. – Frank

+0

Sí, dudé en preguntarle a Raph qué esperaba hacer con la lista filtrada. Pero también hay muchos escenarios en los que solo quieres aplanar. – Nicolas

+0

A veces quiero recuperar el contenido de los objetos 'Opción', pero otras veces necesito que permanezcan como' Opción [A] '. Estoy encontrando más y más usos para 'Opción [A]' - función interesante. – Ralph

10

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

Cuestiones relacionadas