我正在学习 RxJava,作为我的第一个实验,尝试重写第一个中的代码run()
中的方法这段代码 https://gist.github.com/benjchristensen/4671081(引用于Netflix 的博客 http://techblog.netflix.com/2013/02/rxjava-netflix-api.html作为 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)));
}
});
Next, f4
and 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
ing它们可能不是我想要的......)但允许我最后这样做,而不完全是我想要的:
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()));
我不明白如何在同一行上访问这两个返回值。我想我可能缺少一些函数式编程的东西。我怎样才能做到这一点?谢谢。