我正在学习 RxJava,并且作为我的第一个实验,尝试重写此代码中第run()
一种方法中的代码(在Netflix 的博客中引用为 RxJava 可以帮助解决的问题)以使用 RxJava 提高其异步性,即它不会f1.get()
在继续执行其余代码之前,请等待第一个 Future ( ) 的结果。
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()));
我不明白如何在同一行访问这两个返回值。我认为这里可能缺少一些函数式编程。我怎样才能做到这一点?谢谢。