58 votes

scala Iterable#map vs. Iterable#flatMap

Quelle est la différence entre le map et flatMap fonctions de Iterable ?

55voto

kikibobo Points 572

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 .

44voto

agilefall Points 2081

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)

8voto

skaffman Points 197885

De scaladoc :

  • carte

Retourne l'itérable résultant de l'application de la fonction f donnée à chaque élément de cet itérable.

  • flatMap

Applique la fonction donnée f à chaque élément de cet itérable, puis concatène les résultats.

8voto

Daniel C. Sobral Points 159554
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.

3voto

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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X