2016-09-07 3 views
1

ich zwei Observablen kombinieren möchten, gibt man n Elemente und die andere nur 1.RXJava - combineLatest ohne Ergebnis zu verlieren

combineLatest warten, bis beide Observablen haben mindestens ein Element emittiert wird, und kombiniert dann die neuesten emittiert Gegenstände, bis beide beobachtbar sind. Betrachten wir folgende chronologisch bestellen:

  • Observable A -> emittiert A1 Ergebnis
  • Observable A -> emittiert A2 Ergebnis
  • Observable B -> emittiert Ergebnis B1

combineLatest nur Ergebnis kombinieren 2 von beobachtbaren 1 mit Ergebnis 1 von beobachtbaren 2 (kann hier leicht tester sein: http://rxmarbles.com/#combineLatest).

Was ich

brauche ich, um alle Elemente von zwei Observablen zu kombinieren, egal welche schneller ist. Wie kann ich das machen?

Ergebnis soll (immer, unabhängig davon, welche beobachtbaren beginnen Artikel zuerst emittierende!) Sein:

  • A1 in Kombination mit B1
  • A2 mit B1 kombiniert
+0

Meinst du, dass Sie alle Permutationen einer Sequenz 'a' wollen, mit der Sequenz 'b'? Oder willst du sie zippen? http://reactivex.io/documentation/operators/zip.html – flakes

+0

alle Permutationen ... Ein Observable gibt nur 1 Item aus, die anderen n Items und ich möchte n Kombinationen erhalten (alle n Items, jeweils kombiniert mit dem 1 item) – prom85

+0

Ich habe mein Beispiel angepasst, um das klarer zu machen ... – prom85

Antwort

0

Hinweis: Dies ist nicht getestet:

Erstellen Sie eine ReplaySubject aus beobachtbaren Sequenz a. Für jeden Wert, der in der Sequenz b ausgegeben wird, kombinieren Sie diesen Wert mit dem Wiedergabesubjekt, um eine neue Observable von Pair<A, B> zu erstellen. Stellen Sie diese Observablen zusammen und geben Sie sie als Ergebnis zurück.

public static <A, B> Observable<Pair<A, B>> permutation(
    Observable<A> observableA, 
    Observable<B> observableB, 
) { 
    ReplaySubject<A> subjectA = ReplaySubject.create(); 
    observableA.subscribe(subjectA::onNext); 
    return observableB.flatMap(b -> subjectA.map(a -> Pair.of(a, b))); 
} 
+0

Ich werde das versuchen ... Ich möchte eigentlich eine Funktion, die sequenzielle Ausführung einer beliebigen Anzahl von Elementen unterstützt ... Ich habe eine Funktion dafür geschrieben, die funktioniert, aber es ist einfach nicht schön und nicht wirklich das RX Java. .. – prom85

Verwandte Themen