2012-04-11 11 views
75

Se ho un List[Option[A]] in Scala, qual è il modo idiomatico per filtrare i valori None?Come filtrare gli elementi fuori dalla lista [Opzione]?

Un modo è quello di utilizzare il seguente:

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

C'è un modo più "idiomatica"? Questo sembra piuttosto semplice.

+1

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

risposta

120

Se si vuole sbarazzarsi delle opzioni allo stesso tempo, è possibile utilizzare flatten:

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

Vorrei aggiungere che 'flatMap' può essere utilizzato per elaborare gli elementi dell'elenco diversi da' None' s, simile a 'someList.flatten.map', come spesso si vuole lavorare con questi elementi e non semplicemente" appiattire "l'elenco per divertimento. – Frank

+0

Sì, ho esitato a chiedere a Raph cosa si aspetta di fare con la lista filtrata. Ma ci sono anche molti scenari in cui vuoi semplicemente appiattirti. – Nicolas

+0

A volte voglio recuperare il contenuto degli oggetti 'Opzione', ma altre volte ho bisogno che rimangano come' Opzione [A] '. Sto trovando sempre più usi per 'Opzione [A]' - caratteristica interessante. – Ralph

10

someList.filter(_.isDefined) se si desidera mantenere il tipo di risultato come List[Option[A]]

Problemi correlati