2016-05-12 3 views

Antwort

1

Der Zweck der flatmap Funktionen ist es, eine Funktion, die eine Liste zurückgibt, und dann das Ergebnis zu glätten.

So wird es die iterable (die in diesem Fall teilt) zuordnen, dann reduzieren Sie die resultierende 2D iterable (Liste in diesem Fall).

+0

ok, ich habe es, danke. –

1

Lassen Sie uns die Dinge etwas erweitern. Lassen Sie uns zunächst Ihre xxx mit Beispielen der Art definieren, die ich glaube, Sie beabsichtigen:

val xxx = Array("hello there 马慧超", "how are you", "nice to meet you") 

Nun lassen Sie uns Ihre Logik länger Hand schreiben:

def words(str : String) : Array[String] = str.split(" ") 
xxx.flatMap(string => words(string)) 

Wir arbeiten mit einer Reihe von Strings beginnen. An irgendeinem Zwischenpunkt wird die Funktion words für jeden dieser unmittelbaren Strings aufgerufen, was Array[String] ergibt, so dass wir konzeptionell eine Sequenz von Arrays of String haben.

Aber wir enden mit nur einem Array von Strings, "abgeflacht", dass jedes der Wörter in der Zwischensequenz von Wort-Arrays Teil eines langen Arrays wird.

Also, konzeptionell, zuerst führen wir diese Mapping-Funktion (words, oder direkter split in diesem Fall), und dann plätten wir.

Also, um Ihre Frage direkt zu beantworten, split dann flach.


Update (More, ‚Cuz warum nicht?)

Es ist nicht einmal klar, was es bedeuten würde, eine Folge von Strings zu‚glätten‘, aber informell könnte man Verkettung zuerst vorstellen. Wir können leicht beweisen, dass dies nicht durch Instrumentierung geschieht. Wenn Sie versuchen

def words(str : String) : Array[String] = {println(str); str.split(" ")} 
xxx.flatMap(string => words(string)) 

Sie werden alle einzelnen Strings, nicht eine verkettete Zeichenfolge sehen.

Dies ist logisch notwendig für andere Typen mit flatMap Methoden. Für

Some("there").flatMap(str => Some(str.toUpperCase)) 

gibt es keine „Abflachung“ Sie auf die Option durchführen konnte Some(there) auf dem flatMap genannt wird. "Abflachung" ist nur dann definiert und bedeutungsvoll, wenn wir monadische Kontexte verschachtelt haben, d. h. wenn wir über einen hypothetischen Zwischenwert denken, bei dem eine flatten-Methode aufgerufen würde, Some(THERE) zu erzeugen.

+0

Danke mein Freund, ich habe es, sehr schätzen Sie. –

0

Die flatMap kann als die Kombination von Operation 'map' und 'flatten' gesehen werden.

Wie für Ihre Frage, ist die Antwort "Split" zuerst und dann "flatten".

Das folgende Beispiel wird, um dies zu veranschaulichen:

val nestedNumbers = List(List(1, 2), List(3, 4)) 

nestedNumbers.flatMap(x => x.map(_ * 2)) 

der Ausgang

res0: List[Int] = List(2, 4, 6, 8) 

ist, der mit dem folgenden Code entspricht:

nestedNumbers.map((x: List[Int]) => x.map(_ * 2)).flatten 

, sein Ausgang ist auch

res0: List[Int] = List(2, 4, 6, 8) 

die Referenz ist es https://twitter.github.io/scala_school/zh_cn/collections.html#flatMap

viel Glück

+0

ok, jetzt weiß ich es, danke Jungs, es ist sehr warmes Herz von dir. –

1

flatMap ist eine Kombination von Karte und dann abflachen haben. Beispiel unten kann den Prozess erklären, in dem wir map aufrufen und dann flatten und das Ergebnis ist ein List [Char], während flatMap den Seq direkt in List [Char] konvertiert.

val avengers = Seq("Ironman", "Thor", "Captain America") 
val capsAvengers = avengers.map(_.toUpperCase) 
println(avengers) 
println(capsAvengers) 
println(capsAvengers.flatten) 
println(avengers.flatMap(.toUpperCase)) 

Ergebnis:

List(Ironman, Thor, Captain America) 

List(IRONMAN, THOR, CAPTAIN AMERICA) 

List(I,R,O,N,M,A,N,T,H,O,R,C,A,P,T,A,I,N, ,A,M,E,R,I,C,A) 

List(I,R,O,N,M,A,N,T,H,O,R,C,A,P,T,A,I,N, ,A,M,E,R,I,C,A) 
+0

Danke Ich habe es, sehr schätzen –

1

Viele gute Antworten, aber alle sind viel zu lang :) Es ist sehr einfach: Bevor Sie gespalten, es gibt nichts zu glätten ist.

+0

- - !, müssen Sie ein kluger Junge sein, danke. –

Verwandte Themen