Frage

Was ist der Unterschied zwischen den map und flatMap Funktionen von Iterable?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top