2016-06-07 5 views
6

Ich möchte meine beobachtbar wie if/else AussageRxJava Filter 'else'

So etwas spalten:

A[] array = new A[10]; 
for (int i = 0; i < array.length; i++) { 
    array[i] = new A(getRandomString(), getRandomInt()); 
} 

Observable.from(array) 
    .filter(a -> condition(a)) 
     .// <--- do stuff if condition returns true 
     .// <- back to parent 
    .filter(a -> complexCondition(a)) // filter all elements(!) 
     .// <--- do stuff if complex condition returns true 
     .// <- back to iterate all elements 

Ist es überhaupt möglich?

+0

Was ist los mit der Verwendung einer 'if' Anweisung in' doOnNext() ',' map', etc? – nhaarman

+0

@nhaarman mit doOnNext können Sie die gefilterten Daten auf dem RxJava-Weg nicht weiter verarbeiten. –

Antwort

2

Eine Möglichkeit, dieses Verhalten zu erreichen, zweimal, um Ihre Daten zu abonnieren und filtern anders:

Subscription subscriptionA = Observable.from(array) 
    .filter(a -> condition(a)) 
    .subscribe(...) // <-- do stuff for condition A 

Subscription subscriptionB = Observable.from(array) 
    .filter(a -> complexCondition(a)) 
    .subscribe(...) // <-- do stuff for condition B 
0

Um auf Ken's answer zu erweitern, besteht eine andere Möglichkeit darin, das Observable in die zwei Zweige zu verzweigen, unter Verwendung der replay operator. Dies garantiert, dass das ursprüngliche Observable nur einmal aufgerufen wird. Dies ist nützlich, wenn es einige teure Verarbeitung oder Nebenwirkungen irgendwo in der Kette ist:

ConnectableObservable<A> connectable = Observable.fromArray() 
    .replay(); 

connectable 
    .filter(a -> condition(a)) 
    .// <--- do stuff if condition returns true 

connectable.connect(); // do this after the first branch 

connectable 
    .filter(a -> complexCondition(a)) // filter all elements(!) 
    .// <--- do stuff if complex condition returns true 

connectable 
    .// <- iterate all elements 

Denken Sie daran, dass alle Zweige sowohl die OnNext behandeln müssen und die onError Ereignisse.