Zip演算子を探しているようです。
使い方はいくつかありますので、例を見てみましょう。さまざまなタイプの単純なオブザーバブルがいくつかあるとします。
Observable<Integer> obs1 = Observable.just(1);
Observable<String> obs2 = Observable.just("Blah");
Observable<Boolean> obs3 = Observable.just(true);
それらすべてを待つ最も簡単な方法は次のようなものです。
Observable.zip(obs1, obs2, obs3, (Integer i, String s, Boolean b) -> i + " " + s + " " + b)
.subscribe(str -> System.out.println(str));
zip関数では、パラメーターには、zipされているオブザーバブルのタイプに対応する具象タイプがあることに注意してください。
オブザーバブルのリストを直接圧縮することもできます。
List<Observable<?>> obsList = Arrays.asList(obs1, obs2, obs3);
Observable.zip(obsList, (i) -> i[0] + " " + i[1] + " " + i[2])
.subscribe(str -> System.out.println(str));
...またはリストをObservable<Observable<?>>
:にラップすることによって
Observable<Observable<?>> obsObs = Observable.from(obsList);
Observable.zip(obsObs, (i) -> i[0] + " " + i[1] + " " + i[2])
.subscribe(str -> System.out.println(str));
ただし、どちらの場合も、Object[]
リスト内のオブザーバブルのタイプとその数が事前にわからないため、zip関数は単一のパラメーターのみを受け入れることができます。これは、zip関数がパラメーターの数をチェックし、それに応じてそれらをキャストする必要があることを意味します。
とにかく、上記の例はすべて最終的には印刷されます 1 Blah true
編集: Zipを使用する場合はObservables
、zipするすべてのアイテムが同じ数のアイテムを放出することを確認してください。上記の例では、3つのオブザーバブルすべてが1つのアイテムを放出しました。それらを次のようなものに変更する場合:
Observable<Integer> obs1 = Observable.from(new Integer[]{1,2,3});
Observable<String> obs2 = Observable.from(new String[]{"Blah","Hello"});
Observable<Boolean> obs3 = Observable.from(new Boolean[]{true,true});
次に、zip関数に渡されるアイテムは1, Blah, True
and2, Hello, True
だけです。3
他のオブザーバブルが完了したため、アイテムが圧縮されることはありません。