Scala Iterable # map vs. Iterable # flatMap
-
21-08-2019 - |
Domanda
Qual è la differenza tra il map
e flatMap
funzioni di Iterable
?
Soluzione
Qui è una buona spiegazione:
http: // www. codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
Utilizzo lista come un esempio:
la firma di Map è:
map [B](f : (A) => B) : List[B]
e flatMap di è
flatMap [B](f : (A) => Iterable[B]) : List[B]
Quindi flatMap prende un tipo [A] e restituisce un tipo iterabile [B] e mappa prende un tipo [A] e restituisce un tipo di [B]
Questo vi darà anche un'idea che flatmap sarà "appiattire" le liste.
val l = List(List(1,2,3), List(2,3,4))
println(l.map(_.toString)) // changes type from list to string
// prints List(List(1, 2, 3), List(2, 3, 4))
println(l.flatMap(x => x)) // "changes" type list to iterable
// prints List(1, 2, 3, 2, 3, 4)
Altri suggerimenti
Quanto sopra è tutto vero, ma c'è una cosa che è a portata di mano: flatMap
trasforma un List[Option[A]]
in List[A]
, con qualsiasi Option
che entra in profondità per None
, rimosso. Questo è un passo avanti concettuale fondamentale per ottenere parte l'utilizzo di null
.
scaladoc :
- mappa
Restituisce l'iterabile risultante dall'applicare la funzione data f ogni elemento di questo iterabile.
- flatMap
Si applica la funzione data f a ciascun elemento di questo iterabile, allora concatena i risultati.
lines.map(line => line split "\\W+") // will return a list of arrays of words
lines.flatMap(line => line split "\\W+") // will return a list of words
Si può vedere questo meglio a comprensioni:
for {line <- lines
word <- line split "\\W+"}
yield word.length
questo si traduce in:
lines.flatMap(line => line.split("\\W+").map(word => word.length))
Ogni iteratore all'interno per sarà tradotto in un "flatMap", tranne l'ultimo, che si traduce in una "mappa". In questo modo, invece di tornare collezioni annidate (un elenco di una serie di un buffer di bla, bla, bla), si ritorna una collezione piatta. Una collezione formata dagli elementi in fase di yield'ed -. Una lista di interi, in questo caso
Guardate qui: http: //www.codecommit. com / blog / Scala / Scala-collezioni-per-il-facilmente-annoiato-parte-2
"Cerca flatMap" - c'è davvero una buona spiegazione di lì. (Fondamentalmente si tratta di una combinazione di "appiattire" e "mappare" - caratteristiche da altre lingue).