RxJava: como compor vários observáveis com dependências e coletar todos os resultados no final?

Estou aprendendo RxJava e, como minha primeira experiência, tentando reescrever o código na primeirarun() método emesse código (citado emBlog da Netflix como um problema que o RxJava pode ajudar a resolver) para melhorar sua assincronicidade usando o RxJava, ou seja, para não esperar o resultado do primeiro Futuro (f1.get()) antes de prosseguir para o restante do código.

f3 depende def1. Eu vejo como lidar com isso,flatMap parece fazer o truque:

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 ef5 dependerf2. Eu tenho isto:

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

O que começa a ficar estranho (mergeprovavelmente não é o que eu quero ...), mas me permite fazer isso no final, não exatamente o que eu quero:

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

Isso me dá:

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

que são todos os números, mas infelizmente recebo os resultados em invocações separadas, por isso não posso substituir completamente o println final no código original:

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

Não entendo como obter acesso a esses dois valores de retorno na mesma linha. Eu acho que provavelmente há alguma programação funcional que eu estou perdendo aqui. Como posso fazer isso? Obrigado.

questionAnswers(3)

yourAnswerToTheQuestion