Come filtrare Nessuno è fuori dall'elenco [Opzione]?


105

Se ho un List[Option[A]]in Scala, qual è il modo idiomatico per filtrare i Nonevalori?

Un modo è utilizzare quanto segue:

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

Esiste un modo più "idiomatico"? Sembra piuttosto semplice.


Risposte:


161

Se vuoi eliminare le opzioni allo stesso tempo, puoi usare flatten:

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

23
Aggiungerei che flatMappuò essere utilizzato per elaborare gli elementi della lista diversi da Nones, in modo simile a someList.flatten.map, poiché spesso si vuole lavorare con questi elementi e non solo flattenper divertimento.
Frank

Sì, ho esitato a chiedere a Raph cosa si aspettava di fare con l'elenco filtrato. Ma ci sono anche molti scenari in cui vuoi solo appiattire.
Nicolas

A volte voglio recuperare il contenuto degli Optionoggetti, ma altre volte ho bisogno che rimangano come Option[A]. Sto trovando sempre più usi per Option[A]- funzionalità interessante.
Ralph

Esiste un metodo di tipo flatForeach equivalente?
cdmckay

1
Se la tua raccolta è immutabile, faltmap farà il trucco. Se la tua collezione è mutevole, no, non c'è.
Nicolas

18

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


2

La catslibreria ha anche flattenOption, che trasforma qualsiasi F[Option[A]]in un F[A](dov'è F[_]un FunctorFilter)

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.