RxJava: как составить несколько Observables с зависимостями и собрать все результаты в конце?

Я изучаю RxJava и, как мой первый эксперимент, пытаюсь переписать код в первомrun() метод вэтот код (цитируется поБлог Netflix как проблема, которую может помочь решить RxJava) улучшить свою асинхронность, используя RxJava, то есть он не ждет результата первого Future (f1.get()) прежде чем перейти к остальной части кода.

f3 зависит отf1, Я вижу, как справиться с этим,flatMap кажется, делает свое дело:

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)));
        }
    });

Следующий,f4 а такжеf5 зависит отf2, У меня есть это:

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);
        }
    });

Который начинает становиться странным (mergeИх, вероятно, не то, что я хочу ...), но позволяет мне сделать это в конце, не совсем то, что я хочу:

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);
            }
        });
    }
});

Это дает мне:

Observed from f3: responseB_responseA
Observed from f4 and f5: 140
Observed from f4 and f5: 5100

это все числа, но, к сожалению, я получаю результаты в отдельных вызовах, поэтому я не могу полностью заменить окончательный println в исходном коде:

System.out.println(f3.get() + " => " + (f4.get() * f5.get()));

Я не понимаю, как получить доступ к обоим возвращаемым значениям в одной строке. Я думаю, что, возможно, здесь есть какое-то функциональное программирование, которое мне не хватает Как я могу это сделать? Благодарю.

Ответы на вопрос(3)

Ваш ответ на вопрос