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 (mergeWahrscheinlich 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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage