2016-06-07 28 views
6

chcę podzielić moim zaobserwować jak if/else oświadczeniefiltr RxJava 'inny'

coś takiego:

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 

Czy to w ogóle możliwe?

+0

Co jest nie tak z użyciem instrukcji 'if' w' doOnNext() ',' map', etc? – nhaarman

+0

@nhaarman z doOnNext nie będzie można dalej przetwarzać filtrowanych danych w sposób RxJava. –

Odpowiedz

2

Jednym ze sposobów osiągnięcia tego zachowania jest, aby zapisać się do swoich danych dwa razy i filtrować je różnie:

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

Aby rozwinąć na Ken's answer, inną opcją jest "rozwidlenie" obserwowalnego w dwóch gałęziach przy użyciu replay operator. Gwarantuje to, że oryginalne obserwowalne jest wywoływane tylko raz. Jest to przydatne, jeśli istnieje kilka drogich przetwarzania lub niepożądane skutki gdzieś w łańcuchu:

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 

Pamiętaj, że wszystkie gałęzie muszą obsługiwać zarówno onNext i wydarzenia onError.