2017-07-26 2 views
0

Was ist der Unterschied zwischen map und flatMap? Wie in können wir einUnterschied zwischen Karte und Flatmap in Scala

1 to 5 map(c => println(c)) 

tun, aber nicht

1 to 5 flatMap(c => println(c)) 

Auf der anderen Seite, diese

def h(i: Int) = if (i >= 2) Some(i) else None 
1 to 5 flatMap(h) 

arbeitet Ich verstehe, dass flatMap Karte ist und flach, aber nicht sicher, wenn ein Karte kann verwendet werden und wenn eine FlatMap verwendet werden kann.

+1

[Karte gegen FlatMap auf Zeichenfolge] verwenden (https://stackoverflow.com/questions/19209519/map-versus-flatmap -on-string) Beantworten Sie Ihre Frage – prayagupd

+0

Dies ist ähnlich wie https://stackoverflow.com/questions/42997900/apache-spark-comparison-of-map-vs-flatmap-vs-mappartitions-vs-mappartitionswith –

Antwort

3

Lassen Sie uns die Signatur von flatMap sehen.

def flatMap[B](f: (Int) ⇒ GenTraversableOnce[B]): TraversableOnce[B] 

und die Unterschrift des map

def map[B](f: (A) ⇒ B): IndexedSeq[B] 

Sie können sehen, dass der Ergebnistyp von fGenTraversableOnce[B] für flatMap sein muss. , aber es gibt keine Einschränkung in der Ergebnisart von f für map.

Der Ergebnistyp von println(x) ist Unit und der Ergebnistyp x+2 ist Int. Da beide GenTraversableOnce[B] nicht implementieren, können Sie flatMap(x=>println(x)) noch flatMap(x=>x+2) nicht tun.

Auf der anderen Seite Some(i) und None haben Art von Option[Int], die implizit source

Die Signatur von Iterable ist

trait Iterable[+A] extends Traversable[A] 

und Traversable ist

trait Traversable[+A] .. with TraversableOnce[A]` 

zu Iterable[Int] umgewandelt werden können und schließlich TraversableOnce ist

trait TraversableOnce[+A] extends GenTraversableOnce[A] 

daher Option[Int] implementiert GenTraversableOnce[Int], so dass Sie es als Ergebnis von flatMap[Int]

1

Der Fehler ist:

Typenkonflikt, erwartet: (int) => GenTraverableOnce [NotInferedB], aktuell: (int) => Einheit

Da flatMap ist eine Kombination aus map und flatten. So flatMap wird Karte auf jedem Element der Sequenz ausgeführt und dann flatten ausgeführt.

Zum Beispiel: [1,2][2,3] ->[1,2,2,3]

Scala nicht mit Typ-Einheit tun. Technisch, weil Unit GenTraverableOnce nicht implementiert. Option nicht, aber Option[A] kann implizit in Iterable[A] konvertiert werden, was GenTraverableOnce[A] ist. Hier ist die reference

+0

danke für die Hilfe. Warum funktioniert das nicht dann flatMap (x => x + 2) wo funktioniert das als map (x => x + 2)? Vielleicht hast du es schon erwähnt, aber ich bekomme keine Antwort. – Srinivas

+0

'flatMap (x => x + 2)' funktioniert immer noch nicht, weil die Signatur zu dieser Zeit ist: 'flatMap [Int, Int]'. Aber Int implementiert nicht "GenTraversableOnce". 'map' hat diese Einschränkung nicht. Sie können von beliebigem Typ A zu beliebigem Typ B mappen. – hqt

+0

Sie können 'flatMap (x => Some (x))' 'weil zu dieser Zeit' flatMap' Unterschrift 'flatMap [Int, Option]' ist. Aber 'Option [A]' kann implizit in 'GenTraverableOnce [A]' konvertiert werden. Sie können auf diesem Link sehen: https://stackoverflow.com/questions/11429360/is-option-gentraversableonce – hqt

Verwandte Themen