2017-07-24 53 views
2

我有一個Observable,永遠不會完成。它發出一個List<Item>。每當它發出該列表時,我需要過濾掉其中的一些項目。目前我有這個作爲解決方案:RxJava 2:如何過濾發出「列表<Item>」的無限流的項目?

mData.getItemsObservable() // Observable<List<Item>> 
     .compose(...) 
     .flatMapSingle(items -> Observable.fromIterable(items) 
       .filter(item -> item.someCondition()) 
       .toList()) 
     .subscribe(items -> { 
      // ... 
     }, error -> { 
      // ... 
     }); 

這是篩選出一些項目的最佳方式?有沒有更簡單(更可讀)的方法來做同樣的事情?

我已經試過這太,但它並沒有發出任何東西:如果你要堅持RxJava

mData.getItemsObservable() // Observable<List<Item>> 
     .compose(...) 
     .flatMap(Observable::fromIterable) // or like this: flatMapIterable(items -> items) 
     .filter(item -> item.someCondition()) 
     .toList() 
     .subscribe(items -> { 
      // ... 
     }, error -> { 
      // ... 
     }); 
+0

除了使用IxJava,第一種方式是一個。第二個將不會完成,因爲你展開每個列表項目,並有一個無限的; toList需要像第一種情況下的flatMapSingle中那些有限的那些。 – akarnokd

+0

@akarnokd感謝您的解釋。因此,如果我理解正確,第一種方法是過濾出項目的方式?它看起來不如第二種方法好。有什麼可以改進的嗎?謝謝 –

回答

1

第一種方法是好的。否則,你可以使用IxJava並直接在map操作執行過濾:

mData.getItemsObservable() // Observable<List<Item>> 
    .compose(...) 
    .map(v -> Ix.from(v).filter(w -> w.someCondition()).toList()) 
    .subscribe(items -> { 
     // ... 
    }, error -> { 
     // ... 
    }); 
+0

謝謝,我現在堅持使用RxJava並使用第一種方法。我會記住它。 –

相關問題