Wann benutzt du map vs flatMap in RxJava?
Wann nutzen Sie die Karte vs flatMap in RxJava?
Zum Beispiel sagen, wir wollen die map-Dateien mit JSON Strings, die die JSON--
Map, mit der wir umgehen müssen die Ausnahme irgendwie. Aber wie?:
Observable.from(jsonFile).map(new Func1<File, String>() {
@Override public String call(File file) {
try {
return new Gson().toJson(new FileReader(file), Object.class);
} catch (FileNotFoundException e) {
//So Exception. What to do ?
}
return null; //Not good :(
}
});
Mit flatMap, es ist viel Ausführlicher, aber wir können vorwärts, das problem der Kette von Observablen und den Fehler behandeln, wenn wir entscheiden, woanders und auch wiederholen:
Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
@Override public Observable<String> call(final File file) {
return Observable.create(new Observable.OnSubscribe<String>() {
@Override public void call(Subscriber<? super String> subscriber) {
try {
String json = new Gson().toJson(new FileReader(file), Object.class);
subscriber.onNext(json);
subscriber.onCompleted();
} catch (FileNotFoundException e) {
subscriber.onError(e);
}
}
});
}
});
Ich mag die Einfachheit der Karte, aber die Fehlerbehandlung von flatmap (nicht die Ausführlichkeit). Ich habe nicht gesehen, alle best practices auf diesem Umlauf und ich bin gespannt, wie dies in der Praxis genutzt.
InformationsquelleAutor der Frage Christopher Perry | 2014-04-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
map
transformieren einem Ereignis zum anderen.flatMap
verwandeln ein Ereignis, um null oder mehr event. (aus IntroToRx)Wie Sie wollen, verwandeln Sie Ihre json ein Objekt, mit Karte sollte genug sein.
Umgang mit der FileNotFoundException ist ein anderes problem (mit map oder flatmap würde nicht das Problem lösen).
Lösen Ihre Ausnahme-problem, werfen Sie es einfach mit einem Nicht geprüft-Ausnahme : RX rufen Sie die onError-handler für Sie.
die exakt gleiche version mit flatmap :
Können Sie die Rückgabe auch in der flatMap-version eine neue Observable, dass ist nur ein Fehler.
InformationsquelleAutor der Antwort dwursteisen
FlatMap verhält sich sehr viel wie Karte, der Unterschied ist, dass die Funktion, die es gilt gibt es eine erkennbare selbst, so ist es perfekt geeignet, um anzeigen über asynchrone Vorgänge.
Im praktischen Sinn, die Funktion Map wendet die macht gerade eine transformation im Laufe der verketteten Reaktion (nicht wieder eine Beobachtbare); während die Funktion FlatMap gilt gibt ein
Observable<T>
, deshalb FlatMap ist empfehlenswert, wenn Sie planen, einen asynchronen Aufruf innerhalb der Methode.Zusammenfassung:
Ein deutliches Beispiel können hier eingesehen werden: http://blog.couchbase.com/why-couchbase-chose-rxjava-new-java-sdk .
Couchbase Java 2.X-Client verwendet Rx zu stellen asynchrone Aufrufe in einer bequemen Art und Weise. Seit es nutzt die Rx, es hat die Methoden map und FlatMap, die Erklärung in Ihrer Dokumentation könnte hilfreich sein, zu verstehen, das Allgemeine Konzept.
Fehler zu behandeln, überschreiben onError auf Ihre susbcriber.
Könnte es helfen, dieses Dokument anzusehen: http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/
Eine gute Quelle über den Umgang mit Fehlern im RX finden Sie unter: https://gist.github.com/daschl/db9fcc9d2b932115b679
InformationsquelleAutor der Antwort 1vand1ng0
In Ihrem Fall ich denke, Sie müssen anzeigen, da es nur 1 Eingang und 1 Ausgang.
Karte bereitgestellte Funktion einfach akzeptiert, ein Element und gibt eine Sache, die emittiert werden, weiter (nur einmal) nach unten.
flatMap bereitgestellte Funktion akzeptiert ein Element gibt dann ein "Beobachten", d.h. jedes Element der neuen "Beobachten" emittiert werden separat weiter unten.
Kann sein code wird klar, was sich für Sie.
Ausgabe:
InformationsquelleAutor der Antwort mt.uulu
So denke ich über es ist, dass Sie
flatMap
wenn die Funktion, die Sie wollte in dermap()
gibt einObservable
. In dem Fall kann man immer noch versuchen, zu verwendenmap()
aber es wäre unpraktisch. Lassen Sie mich versuchen zu erklären, warum.Wenn in einem solchen Fall, dass Sie beschlossen, stick mit
map
, erhalten Sie eineObservable<Observable<Something>>
. Zum Beispiel in deinem Fall, wenn wir eine imaginäre RxGson Bibliothek, zurückgegeben einObservable<String>
austoJson()
- Methode (anstelle der Rücksendung eineString
) würde es so Aussehen:In diesem Punkt wäre es ziemlich schwierig zu
subscribe()
so zu beobachten. Darin erhalten Sie eineObservable<String>
zu, die Sie wieder brauchen, umsubscribe()
um den Wert. Das ist nicht praktisch oder schön anzusehen.So ist es nützlich eine Idee ist, zu "glätten" das beobachten von observablen (Sie könnten beginnen zu sehen, wo der name _flat_Map kommt). RxJava bietet ein paar Möglichkeiten, Sie zu glätten observablen und aus Gründen der Einfachheit nehmen wir an Zusammenführen ist, was wir wollen. Merge im Grunde nimmt eine Reihe von observablen und strahlt immer, wenn einer von Ihnen strahlt. (Viele Leute würden argumentieren, Schalter wäre ein besserer Standard. Aber wenn Sie emittiert nur ein Wert, ist es eigentlich auch egal.)
Also die änderung unserer vorherigen Codeausschnitt wir würden erhalten:
Dies ist viel mehr nützlich, da die Anmeldung zu, dass (oder Zuordnung oder filtern, oder...) bekommst du nur die
String
Wert. (Auch, wohlgemerkt, solche Variante dermerge()
existiert nicht in RxJava, aber wenn Sie verstehen, die Idee der merge-dann hoffe ich, dass Sie auch verstehen, wie das funktionieren würde.)Also im Grunde, weil solche
merge()
sollte wohl immer nur nützlich sein, wenn es gelingt, einemap()
Rückkehr eine beobachtbare und damit Sie nicht haben, um diese Art immer und immer wiederflatMap()
entstand als eine Kurzform. Es gilt die mapping-Funktion genauso wie eine normalemap()
würde, aber später anstelle der Aussendung der zurückgegebenen Werte es ebenfalls "verflacht" (oder fusioniert).Dass die Allgemeinen Anwendungsfall. Es ist sehr nützlich, in eine Codebasis verwendet Rx auf dem gesamten Platz und Sie haben viele Methoden, die Rückkehr observablen, die Sie wollen, um die Kette mit anderen Methoden zurückgeben observablen.
Verwenden, falls es passiert, um nützlich zu sein als gut, weil
map()
können nur verwandeln ein Wert ausgegeben, dassonNext()
in einem anderen Wert ausgegebenonNext()
. Aber es kann nicht die Umwandlung in mehrere Werte, kein Wert oder ein Fehler. Und wie akarnokd schrieb in seiner Antwort (und wohlgemerkt, er ist viel schlauer als ich, wohl im Allgemeinen, aber zumindest wenn es um RxJava) sollten Sie nicht throw Ausnahmen von Ihremmap()
. Also anstatt die Sie verwenden könnenflatMap()
undwenn alles gut geht, aber
wenn etwas ausfällt.
Siehe seine Antwort für eine komplette snippet: https://stackoverflow.com/a/30330772/1402641
InformationsquelleAutor der Antwort Marcin Koziński
Hier ist eine einfache Daumen-Regel, dass ich helfen, mich zu entscheiden, wie, Wann
flatMap()
übermap()
im Rx -Observable
.Sobald Sie zu einer Entscheidung kommen, dass Sie sich zu beschäftigen
map
transformation, würden Sie schreiben Ihre transformation code wieder einige Objekt-richtig?Wenn das, was Sie zurückgeben, als Ergebnis Ihrer transformation ist:
eine nicht-observable-Objekt, dann würden Sie nur
map()
. Undmap()
wickelt das Objekt in einen Beobachtbaren und strahlt es.eine
Observable
Objekt, dann würden Sie verwendenflatMap()
. UndflatMap()
packt die Beobachtbaren, nimmt die zurückgegebenen Objekts, wickelt es mit seinen eigenen Beobachtbaren und strahlt es.Sagen, wir haben zum Beispiel eine Methode titleCase(String inputParam) zurückgibt, mit dem Titel Cased-Objekt "String" der input-param. Der Rückgabetyp dieser Methode kann
String
oderObservable<String>
.Wenn der Rückgabetyp von
titleCase(..)
waren, auf bloßeString
, dann würden Sie verwendenmap(s -> titleCase(s))
Wenn der Rückgabetyp von
titleCase(..)
warenObservable<String>
, dann würden Sie verwendenflatMap(s -> titleCase(s))
Hoffe, dass klärt.
InformationsquelleAutor der Antwort karthiks
Ich wollte nur hinzufügen, dass mit
flatMap
Sie nicht wirklich brauchen, um verwenden Sie Ihre eigenen benutzerdefinierten Beobachtbaren innerhalb der Funktion und verlassen Sie sich auf standard-factory-Methoden/Operatoren:In der Regel sollten Sie es vermeiden, werfen (Runtime-) exceptions von onXXX-Methoden und callbacks, wenn möglich, auch wenn wir so viele Sicherheitsmaßnahmen wie wir konnten in RxJava.
InformationsquelleAutor der Antwort akarnokd
In diesem Szenario verwenden Sie die Karte nicht brauchen, eine neue Beobachtbar.
sollte man Exceptions verwenden.propagieren, das ist ein wrapper, so dass Sie senden können diese überprüft Ausnahmen von der rx-Mechanismus
Sie dann behandeln soll, diese Fehler in der Abonnenten
Es ist eine ausgezeichnete post: http://blog.danlew.net/2015/12/08/error-handling-in-rxjava/
InformationsquelleAutor der Antwort ndori
Die Frage ist Wann nutzen Sie die Karte vs flatMap in RxJava?. Und ich denke, eine einfache demo-spezifischer ist.
Wenn Sie möchten, konvertieren Element emittiert, um einen anderen Typ , in deinem Fall die Umwandlung Datei, String, map und flatMap können beide arbeiten. Aber ich bevorzuge map-operator, denn es ist mehr klar.
Jedoch in einen Ort,
flatMap
kann zaubern arbeiten, abermap
nicht. Ich zum Beispiel möchte ein Benutzer die info, aber ich habe zuerst seine id beim user-login. Offensichtlich brauche ich zwei Anfragen, und Sie sind in Ordnung.Lassen Sie uns beginnen.
Hier sind zwei Methoden, eine für die Anmeldung zurückgegeben
Response
, und ein weiteres für die Benutzer-info Holen.Wie Sie sehen, in Funktion flatMap gilt, bei der ersten bekomme ich die Benutzer-id aus
Response
dann fetch Benutzer-info. Wenn zwei Anfragen fertig sind, können wir unsere Arbeit wie die Aktualisierung von UI oder speichern von Daten in die Datenbank ein.Allerdings, wenn Sie verwenden
map
Sie können nicht schreiben, wie schön-code. In einem Wort, istflatMap
uns helfen kann, serialisieren Anfragen.InformationsquelleAutor der Antwort CoXier
In einigen Fällen könnten Sie am Ende mit Kette von observablen, wobei Ihre beobachtbaren zurückkehren würde, andere zu beobachten. 'flatmap' Art der packt die zweite observable, die begraben wird in den ersten ein und lassen Sie direkt Zugriff auf die Daten der zweiten observable ist, spucken Sie aus, während Sie sich registrieren.
InformationsquelleAutor der Antwort Anoop Isaac