web-dev-qa-db-ja.com

rxjavaは異なるタイプのオブザーバブルをマージします

私はrxjavaが初めてです。異なるタイプのオブジェクトを放出する2つのオブザーバブルを組み合わせる必要があります。何かのようなもの Observable<Milk>およびObservable<Cereals>およびObservable<CerealsWithMilk>。私はこのような何かの演算子を見つけることができませんでした。このようなことをするrxの方法は何ですか? MilkCerealsは非同期であることに注意してください。

37
Jelly

必要なものを正確に知らずに言うのは難しいですが、おそらく Zip() または combineLatest() です。

Zipは両方を取りますObservable<Milk>およびObservable<Cereals>そして提供された関数を介してそれらをCerealsWithMilkに結合させます。これはget both a CerealsWithMilkand a Milkを取得するたびに新しいCerealsを発行します。

combineLatestZipと似ていますが、just新しいCerealsWithMilkorだけが新しいMilkが発行される場合でも、新しいCerealsを発行します。

59
Ross Hambrick

異なるタイプのオブザーバブルをマージする場合は、 Observable.Zip を使用する必要があります。

Observable<String> o1 = Observable.just("a", "b", "c");
Observable<Integer> o2 = Observable.just(1, 2, 3);
Observable<String> result = Observable.Zip(o1, o2, (a, b) -> a + b);

resultは、(a, b) -> a + bからo1のアイテムとo2のアイテムのアプリケーションを生成するオブザーバブルです。 "a1", "b2", "c3"を生成する観測可能な結果になります。

任意の関数を使用できます。例えば

    Observable<String> o1 = Observable.just("a", "b", "c");
    Observable<Integer> o2 = Observable.just(1, 2, 3);
    Observable<String> result = Observable.Zip(o1, o2, (a, b) -> myFunc(a, b));
    //...

    private String myFunc(String a, Integer b) {
            //your code here
            return someString;
        }
6
Yuliia Ashomok