Здається, ви шукаєте оператора 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 параметри мають конкретні типи, які відповідають типам спостережуваних, що заархівуються.
Також можна заархівувати список спостережуваних, або безпосередньо:
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));
Однак в обох цих випадках функція zip може приймати лише один Object[]
параметр, оскільки типи спостережуваних у списку не відомі заздалегідь, а також їх кількість. Це означає, що функції zip доведеться перевіряти кількість параметрів і відповідно їх призначати.
Незалежно від того, усі вищезазначені приклади з часом будуть надруковані 1 Blah true
РЕДАГУВАТИ: При використанні Zip переконайтесь, що Observables
всі файли, що застібаються на блискавки, видають однакову кількість елементів. У наведених вище прикладах усі три спостережувані випромінювали один предмет. Якби ми змінили їх на щось подібне:
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});
Тоді 1, Blah, True
і 2, Hello, True
були б єдиними елементами, переданими у функцію zip. Елемент 3
ніколи не буде застібатися на блискавку, оскільки інші спостережувані дані завершено.