RxJava: ¿cómo componer múltiples Observables con dependencias y recopilar todos los resultados al final?

Estoy aprendiendo RxJava y, como mi primer experimento, intento reescribir el código en el primerrun() método eneste codigo (citado enEl blog de Netflix como problema, RxJava puede ayudar a resolver) para mejorar su asincronía usando RxJava, es decir, no espera el resultado del primer futuro (f1.get()) antes de continuar con el resto del código.

f3 depende def1. Veo cómo manejar esto,flatMap Parece funcionar:

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

Próximo,f4 yf5 depender def2. Tengo esto:

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

Lo que comienza a ponerse raro (mergeprobablemente no sea lo que quiero ...) pero me permite hacer esto al final, no exactamente lo que quiero:

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

Eso me da:

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

que son todos los números, pero desafortunadamente obtengo los resultados en invocaciones separadas, por lo que no puedo reemplazar la impresión final en el código original:

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

No entiendo cómo obtener acceso a ambos valores de retorno en la misma línea. Creo que probablemente haya algo de programación funcional que me falta aquí. ¿Cómo puedo hacer esto? Gracias.

Respuestas a la pregunta(3)

Su respuesta a la pregunta