【发布时间】:2014-03-07 02:39:18
【问题描述】:
我正在学习 RxJava,作为我的第一个实验,我尝试重写 this code 中第一个 run() 方法中的代码(在 Netflix's blog 上引用为 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)));
}
});
接下来,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);
}
});
这开始变得很奇怪(mergeing 他们可能不是我想要的......)但最终允许我这样做,而不是我想要的:
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()));
我不明白如何在同一行访问这两个返回值。我认为这里可能缺少一些函数式编程。我怎样才能做到这一点?谢谢。
【问题讨论】:
-
你想要
toList吗?
标签: java functional-programming reactive-programming rx-java