scala Iterable # map vs. Iterable # flatMap
-
21-08-2019 - |
Frage
Was ist der Unterschied zwischen den map
und flatMap
Funktionen von Iterable
?
Lösung
Hier ist eine ziemlich gute Erklärung:
http: // www. codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
Mit Liste als Beispiel:
Karte Unterschrift lautet:
map [B](f : (A) => B) : List[B]
und flatMap das ist
flatMap [B](f : (A) => Iterable[B]) : List[B]
So flatMap nimmt einen Typ [A] und gibt einen iterable Typ [B] und Karte nimmt einen Typ [A] und gibt einen Typ [B]
Dies wird auch Ihnen eine Idee geben, die Listen „abzuflachen“ flatmap.
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)
Andere Tipps
Das oben ist alles wahr, aber es gibt noch eine Sache, die praktisch ist: flatMap
verwandelt einen List[Option[A]]
in List[A]
, mit jedem Option
, die None
bohren nach unten, entfernt. Dies ist ein wichtiger konzeptioneller Durchbruch für die über die Verwendung null
bekommen.
scaladoc :
- Karte
Gibt die iterable resultierenden Aus der gegebenen Funktion f die Anwendung auf Jedes Element dieser iterable.
- flatMap
Wendet die gegebene Funktion f zu jedem Element dieser iterable, dann verkettet die Ergebnisse.
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
Sie können diese sehen besser in für Comprehensions:
for {line <- lines
word <- line split "\\W+"}
yield word.length
Dies schlägt sich in:
lines.flatMap(line => line.split("\\W+").map(word => word.length))
Jeder Iterator innen für wird in einen „flatMap“ übersetzt werden, mit Ausnahme der letzten, die in eine „Karte“ übersetzt wird. Auf diese Weise, anstatt verschachtelte Sammlungen zurückzukehren (eine Liste aus einer Anordnung eines Puffers von bla, bla, bla), kehren Sie eine flache Sammlung. Eine Sammlung, die durch die Elemente yield'ed werden -. Eine Liste von ganzen Zahlen, in diesem Fall
Schau mal hier: http: //www.codecommit. com / blog / scala / scala-Sammlungen-for-the-leicht-bohrten Teil-2
„Suche nach flatMap“ - es ist eine wirklich gute Erklärung dafür gibt. (Im Grunde ist es eine Kombination aus „flach“ und „Karte“ - Funktionen aus anderen Sprachen).