web-dev-qa-db-fra.com

rxjava fusionner des observables de type différent

Je suis nouveau sur rxjava. J'ai besoin de combiner deux observables qui émettent des objets de type différent. Quelque chose comme Observable<Milk> et Observable<Cereals> et obtenez un Observable<CerealsWithMilk>. Je n'ai trouvé aucun opérateur pour quelque chose comme ça. Quelle serait la façon rx de faire quelque chose comme ça? Notez que Milk et Cereals sont asynchrones.

37
Jelly

Il est difficile de dire sans savoir exactement ce dont vous avez besoin, mais peut-être Zip () ou combineLatest () .

Zip prendra les deux Observable<Milk> et Observable<Cereals> et vous permet de les combiner en CerealsWithMilk via une fonction fournie. Cela émet un nouveau CerealsWithMilk à chaque fois que vous obtenez les deux un Milk et un Cereals.

combineLatest est similaire à Zip sauf qu'il émettra un nouveau CerealsWithMilk même si juste un nouveau Milk ou juste un nouveau Cereals est émis.

59
Ross Hambrick

Si vous souhaitez fusionner des observables de type différent, vous devez utiliser 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 sera un observable générant l'application de (a, b) -> a + b aux éléments de o1 et de o2. Il en résulte un rendement observable "a1", "b2", "c3".

Vous pouvez utiliser n'importe quelle fonction. Par exemple

    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