Wenn ich xxx.flatMap(_.split(" "))
verwende, wird es das Array aufteilen und dann flacht ab oder wird es flach und dann geteilt?Was passiert zuerst in flatMap, flacht oder mappt?
Antwort
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).
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.
Danke mein Freund, ich habe es, sehr schätzen Sie. –
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
ok, jetzt weiß ich es, danke Jungs, es ist sehr warmes Herz von dir. –
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)
Danke Ich habe es, sehr schätzen –
Viele gute Antworten, aber alle sind viel zu lang :) Es ist sehr einfach: Bevor Sie gespalten, es gibt nichts zu glätten ist.
- - !, müssen Sie ein kluger Junge sein, danke. –
- 1. Was passiert zuerst? WebAPI-Routing oder web.config?
- 2. Was passiert zuerst? .htaccess oder PHP-Code?
- 3. Wie man einen ArrayBuffer in Scala flacht
- 4. PCA zuerst oder Normalisierung zuerst?
- 5. Rücklaufstapel [- stp]; - Was passiert zuerst? Wird stp dekrementiert oder wird das Element zurückgegeben?
- 6. Was MySQL zuerst ausführt: SELECT oder HAVING?
- 7. Java flatMap - was ist der Unterschied stream.of() und collection.stream()
- 8. was zuerst läuft: Joins oder where-Klausel
- 9. Umgebung zuerst oder zuerst booten?
- 10. PySpark flatMap abzuflachen Liste in einer Liste
- 11. Was passiert in __libc_start_main?
- 12. Scala flatMap, was sind ms und e?
- 13. Soll ich zuerst übersetzen oder zuerst drehen?
- 14. Was passiert, wenn NSTimer in
- 15. Was passiert in 'Montage Fegefeuer'?
- 16. Was passiert eigentlich in lwz?
- 17. Was passiert in diesem Code?
- 18. Flatmap-Äquivalent in PowerShell
- 19. Entwurf oder Prototyp zuerst?
- 20. Was passiert in diesem ternären JavaScript-Operator?
- 21. FlatMap Und Init in Swift
- 22. angularfire2 in ionic2, Wie man mappt?
- 23. WebRequest.GetResponse() ..... Was ist passiert?
- 24. Was passiert, wenn veröffentlicht
- 25. Was passiert, wenn make_shared
- 26. Was passiert mit Nachkommastellen?
- 27. Was passiert, wenn ich eine MySQL-Spalte lösche, ohne zuerst den Index zu löschen?
- 28. Was passiert mit customUserNamePasswordValidatorType?
- 29. was sollte man zuerst machen? Desinfektion oder Validierung
- 30. Was wird zuerst ausgeführt: ToggleButton.IsChecked-Bindungsaktualisierung oder Befehlsbindung?
ok, ich habe es, danke. –