2016-03-17 21 views
7

Mam łańcuch operatorów na RxJava obserwowalne. Chciałbym móc zastosować jednego z dwóch operatorów w zależności od wartości boolowskiej bez "zerwania łańcucha".RxJava: Jak warunkowo zastosować operatorów do obserwowalnego bez zerwania łańcucha

Jestem stosunkowo nowy w Rx (Java) i wydaje mi się, że istnieje prawdopodobnie bardziej idiomatyczny i czytelny sposób na to, niż moje obecne podejście do wprowadzania zmiennej tymczasowej.

Oto konkretny przykład, buforowanie obiektów z obserwowalne jeśli pole wielkość partii jest niezerowe, inaczej emitujące pojedynczej partii nieograniczonej wielkości z toList():

Observable<Item> source = Observable.from(newItems); 
Observable<List<Item>> batchedSource = batchSize == null ? 
       source.toList() : 
       source.buffer(batchSize); 
return batchedSource.flatMap(...).map(...) 

Czy coś takiego jest możliwe? (Pseudo-lambdas ponieważ Java):

Observable.from(newItems) 
    .applyIf(batchSize == null, 
      { o.toList() }, 
      { o.buffer(batchSize) }) 
    .flatMap(...).map(...) 

Odpowiedz

8

Można użyć compose(Func1) pozostać w kolejności, ale zrobić zwyczaj zachowanie

source 
.compose(o -> condition ? o.map(v -> v + 1) : o.map(v -> v * v)) 
.filter(...) 
.subscribe(...) 
+2

Perfect! Dziękuję bardzo. Funkcja "compose()" nie jest obecnie wyświetlana w oficjalnych dokumentach operatora, ale szybkie wyszukiwanie zawierało miły wpis na blogu dosłownie zatytułowany "Do not break the chain": http://blog.danlew.net/2015/03/ 02/dont-break-the-chain/ – user1405990

+0

Co się stanie, jeśli stan jest wewnątrz samego przedmiotu? przykład: wallpapers.map {it.bitmap! = null {download & set} else {just set}} – feresr

+1

Użyj 'flatMap' lub' concatMap'. – akarnokd