web-dev-qa-db-fra.com

scala== matrice # map ou iTrable # platmap

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

58
Landon Kuhn

Voici une très bonne explication:

http://www.codecommit.com/blog/scala/scala-collections-for-the-astillement-bored-part-2

Utilisation de la liste comme exemple:

La signature de la carte est:

map [B](f : (A) => B) : List[B]

et Flatmap's est

flatMap [B](f : (A) => Iterable[B]) : List[B]

Alors platmap prend un type [A] et retourne un type itérable [B] et la carte prend un type [A] et renvoie un type [B]

Cela vous donnera également une idée 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)
44
agilefall

Ce qui précède est tout vrai, mais il y a encore une chose qui est pratique: flatMap active un List[Option[A]] dans List[A], avec n'importe quel Option qui exercure jusqu'à None, supprimé. Il s'agit d'une percée conceptuelle clé pour aller au-delà de l'utilisation de null.

55
kikibobo
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 voir cela mieux pour 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 pour sera traduit en une "plattam", à l'exception de la dernière, qui est traduite dans une "carte". De cette façon, au lieu de retourner des collections imbriquées (liste d'un tableau d'un tampon de Blah, Blah, Blah), vous retournez une collection à plat. Une collection formée par les éléments étant donné - une liste d'entiers, dans ce cas.

8
Daniel C. Sobral

De - Scaladoc :

  • carte

Retourne le démonteur résultant de l'application de la fonction donnée F à chaque élément de cette ierérable.

  • plat

Applique la fonction donnée F à chaque élément de celui-ci, puis concatéra les résultats.

8
skaffman

Regardez ici: http://www.codecommit.com/blog/scala/scala-collections-for-the-asily-bored-Part-2

"Recherche platmap" - il y a une très bonne explication de celui-ci. (Fondamentalement, il s'agit d'une combinaison de "aplatissée" et de "carte" - fonctionnalités d'autres langues).

3
puppetluva