Я изучаю RxJava и, как мой первый эксперимент, пытается переписать код в первом методе run()
в этом коде (цитируется в блог Netflix как проблема RxJava может помочь решить), чтобы улучшить его асинхронность с использованием RxJava, т.е. он не ждет результата первого Будущего (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()));
Я не понимаю, как получить доступ к обеим возвращаемым значениям в одной строке. Я думаю, что там, вероятно, есть некоторые функциональные программы, которые мне не хватает. Как я могу это сделать? Спасибо.