2016-03-17 3 views
7

У меня есть цепочка операторов на наблюдаемой RxJava. Я хотел бы иметь возможность применить один из двух операторов в зависимости от логического значения без «разрыва цепочки».RxJava: Как условно применять операторы к наблюдаемому, не нарушая цепочку

Я относительно новичок в Rx (Java), и я чувствую, что есть, вероятно, более идиоматический и читаемый способ сделать это, чем мой нынешний подход введения временной переменной.

Вот конкретный пример, буферные элементы из наблюдаемой, если поле размер пакета не равен нулю, в противном случае, испускающие единственную партию неограниченного размера с toList():

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

ли что-то подобное возможно? (Псевдо-лямбды, так как Java):

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

ответ

8

Вы можете использовать compose(Func1), чтобы остаться в-последовательности, но сделать нестандартное поведение

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

Отлично! Огромное спасибо. 'compose()' в настоящее время не отображается в официальных документах оператора, но быстрый поиск показал хороший пост в блоге, буквально называемый «Не сломайте цепочку»: http://blog.danlew.net/2015/03/ 02/dont-break-the-chain/ – user1405990

+0

Что делать, если условие находится внутри самого элемента? Например: wallpapers.map {it.bitmap! = null {загрузить & set} else {just set}} – feresr

+1

Используйте 'flatMap' или' concatMap'. – akarnokd

Смежные вопросы