scala Iterable carte # vs. Iterable # flatMap
-
21-08-2019 - |
Question
Quelle est la différence entre les fonctions map
et de flatMap
Iterable
?
La solution
Voici une très bonne explication:
http: // www. codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
En utilisant la liste comme un exemple:
La signature de carte est:
map [B](f : (A) => B) : List[B]
et flatMap est de
flatMap [B](f : (A) => Iterable[B]) : List[B]
flatMap prend un type [A] et renvoie un type itérable [B] et carte prend un type [A] et renvoie un type [B]
Cela vous donnera aussi une idée qui va flatmap listes « aplatir ».
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)
Autres conseils
Ce qui précède est vrai, mais il y a une chose qui est à portée de main: un tourne flatMap
en List[Option[A]]
List[A]
, avec tout ce que Option
jusqu'à fore None
, enlevé. C'est une percée conceptuelle clé pour aller au-delà en utilisant null
.
De scaladoc :
- carte
Retourne le résultat itérables d'application de la fonction f donnée à chaque élément de cette iterable.
- flatMap
applique la fonction donnée f à chaque élément de cette iterable, puis concaténer les résultats.
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 le voir mieux pour 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 iterator intérieur pour sera traduit en « flatMap », à l'exception du dernier, qui est traduite en une « carte ». De cette façon, au lieu de retourner les collections imbriquées (une liste d'un tableau d'un tampon de bla, bla, bla), vous retournez une collection plat. Un ensemble formé par les éléments étant yield'ed -. Une liste de nombres entiers, dans ce cas,
Regardez ici: http: //www.codecommit. com / blog / scala / scala-collections-for-the-facilement partie ennuyez-2
« Rechercher flatMap » - il y a une explication vraiment bien de là. (En fait, il est une combinaison de « aplatir » et « carte » - caractéristiques des autres langues).