私は RxJava を学習しており、最初の実験として、このコードrun()
の最初のメソッドのコードを書き直して (RxJava が解決できる問題としてNetflix のブログで引用されています)、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);
}
});
これは奇妙になり始めます(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()));
同じ行でこれらの両方の戻り値にアクセスする方法がわかりません。ここで見逃している関数型プログラミング fu がおそらくあると思います。これどうやってするの?ありがとう。