web-dev-qa-db-de.com

rxjava fügt Observablen unterschiedlichen Typs zusammen

Ich bin neu in rxjava. Ich muss zwei Observablen kombinieren, die Objekte unterschiedlichen Typs aussenden. Etwas wie Observable<Milk> und Observable<Cereals> und bekomme ein Observable<CerealsWithMilk>. Ich konnte keinen Operator für so etwas finden. Was wäre der richtige Weg, um so etwas zu tun? Beachten Sie, dass Milk und Cereals asynchron sind.

37
Jelly

Es ist schwer zu sagen, ohne genau zu wissen, was Sie brauchen, aber möglicherweise Zip () oder compressLatest () .

Zip nimmt beide Observable<Milk> und Observable<Cereals> und lassen Sie sie über eine bereitgestellte Funktion zu CerealsWithMilk kombinieren. Dies gibt jedes Mal ein neues CerealsWithMilk aus, wenn Sie beide ein Milk erhalten. und ein Cereals.

combineLatest ähnelt Zip, gibt jedoch ein neues CerealsWithMilk aus, auch wenn nur ein neues Milk oder nur ein neues Cereals wird ausgegeben.

59
Ross Hambrick

Wenn Sie Observables unterschiedlichen Typs zusammenführen möchten, müssen Sie Observable.Zip verwenden:

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 ist eine Beobachtungsgröße, die die Anwendung von (a, b) -> a + b auf die Elemente von o1 und o2 generiert. Das Ergebnis ist eine beobachtbare Ausbeute "a1", "b2", "c3".

Sie können jede Funktion verwenden. Beispielsweise

    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