Quelle est la différence entre le map
et flatMap
fonctions de Iterable
?
Réponses
Trop de publicités?Tout ce qui précède est vrai, mais il y a une autre chose qui est pratique : flatMap
transforme un List[Option[A]]
en List[A]
avec n'importe quel Option
qui descend jusqu'à None
supprimé. Il s'agit d'une percée conceptuelle essentielle pour aller au-delà de l'utilisation de la technologie de l'information. null
.
Voici une assez bonne explication :
http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
En utilisant la liste comme exemple :
La signature de la carte est :
map [B](f : (A) => B) : List[B]
et celle de FlatMap est
flatMap [B](f : (A) => Iterable[B]) : List[B]
Ainsi, flatMap prend un type [A] et retourne un type itérable [B] et map prend un type [A] et retourne un type [B].
Cela vous donnera également une idée du fait que flatmap "aplatira" les listes.
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)
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
Vous pouvez mieux voir cela dans les compréhensions :
for {line <- lines
word <- line split "\\W+"}
yield word.length
cela se traduit par :
lines.flatMap(line => line.split("\\W+").map(word => word.length))
Chaque itérateur à l'intérieur de for sera traduit en un "flatMap", sauf le dernier, qui sera traduit en un "map". De cette façon, au lieu de retourner des collections imbriquées (une liste d'un tableau d'un tampon de bla, bla, bla), vous retournez une collection plate. Une collection formée par les éléments retournés -- une liste d'entiers, dans ce cas.
Regardez ici : http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
Recherchez "flatMap" - il y a une très bonne explication à ce sujet. (En fait, il s'agit d'une combinaison de "flatten" et "map" - des caractéristiques provenant d'autres langues).