2016-03-17 13 views
7

Ho una catena di operatori su un osservabile RxJava. Mi piacerebbe essere in grado di applicare uno dei due operatori in base a un valore booleano senza "spezzare la catena".RxJava: Come applicare condizionatamente operatori a un osservabile senza rompere la catena

Sono relativamente nuovo a Rx (Java) e mi sembra che ci sia probabilmente un modo più idiomatico e leggibile di farlo rispetto al mio attuale approccio di introduzione di una variabile temporanea.

Ecco un esempio concreto, il buffering articoli di un osservabile se un campo dimensione del lotto non è nullo, altrimenti emette un singolo lotto di dimensioni illimitate con il toList():

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

è qualcosa di simile possibile? (Pseudo-lambda perché Java):

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

risposta

8

È possibile utilizzare compose(Func1) di rimanere in sequenza, ma fare un comportamento personalizzato

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

Perfetto! Grazie mille. 'compose()' non compare attualmente nei documenti ufficiali dell'operatore, ma una rapida ricerca ha emesso un bel post sul blog letteralmente chiamato "Non rompere la catena": http://blog.danlew.net/2015/03/ 02/dont-break-the-chain/ – user1405990

+0

Cosa succede se la condizione si trova all'interno dell'elemento stesso? esempio: wallpapers.map {it.bitmap! = null {download & set} else {just set}} – feresr

+1

Usa 'flatMap' o' concatMap'. – akarnokd

Problemi correlati