RxJava: Wie erstelle ich mehrere Observables mit Abhängigkeiten und sammle am Ende alle Ergebnisse?
Ich lerne RxJava und versuche als erstes Experiment, den Code im ersten zu schreibenrun()
Methode indieser Code (Zitiert amNetflixs Blog als Problem kann RxJava helfen, seine Asynchronität mit RxJava zu verbessern, d. h. es wartet nicht auf das Ergebnis der ersten Zukunft (f1.get()
), bevor Sie mit dem Rest des Codes fortfahren.
f3
kommt drauf anf1
. Ich sehe, wie ich damit umgehen soll,flatMap
scheint den Trick zu tun:
Observable<String> f3Observable = Observable.from(executor.submit(new CallToRemoteServiceA()))
.flatMap(new Func1<String, Observable<String>>() {
@Override
public Observable<String> call(String s) {
return Observable.from(executor.submit(new CallToRemoteServiceC(s)));
}
});
Nächster,f4
undf5
darauf ankommenf2
. Ich habe das:
final Observable<Integer> f4And5Observable = Observable.from(executor.submit(new CallToRemoteServiceB()))
.flatMap(new Func1<Integer, Observable<Integer>>() {
@Override
public Observable<Integer> call(Integer i) {
Observable<Integer> f4Observable = Observable.from(executor.submit(new CallToRemoteServiceD(i)));
Observable<Integer> f5Observable = Observable.from(executor.submit(new CallToRemoteServiceE(i)));
return Observable.merge(f4Observable, f5Observable);
}
});
Was anfängt komisch zu werden (merge
Wahrscheinlich ist es nicht das, was ich will ...), aber ich kann es am Ende tun, nicht ganz das, was ich will:
f3Observable.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println("Observed from f3: " + s);
f4And5Observable.subscribe(new Action1<Integer>() {
@Override
public void call(Integer i) {
System.out.println("Observed from f4 and f5: " + i);
}
});
}
});
Das gibt mir:
Observed from f3: responseB_responseA
Observed from f4 and f5: 140
Observed from f4 and f5: 5100
Das sind alles Zahlen, aber leider erhalte ich die Ergebnisse in separaten Aufrufen, so dass ich den endgültigen Ausdruck im Originalcode nicht ganz ersetzen kann:
System.out.println(f3.get() + " => " + (f4.get() * f5.get()));
Ich verstehe nicht, wie ich auf beide Rückgabewerte in derselben Zeile zugreifen kann. Ich denke, es gibt wahrscheinlich eine funktionale Programmierung, die ich hier vermisse. Wie kann ich das machen? Vielen Dank.