2017-02-13 7 views
2

リスト内の各項目(オブジェクト)が妥当性チェックを通過し、そのテストに合格する項目のみを持つ結果リストを取得するように、RxJava2でリストをフィルタリングしようとしています。私のオブジェクトは、次の構造、RxJava2フィルタリスト<Object>

class MyClassA { 
    int value1; 
    int value2; 
} 

を持っていた場合たとえば、私は唯一のvalue2が、私はリストの観測を返すAPI呼び出し機能を持っている、すなわち10

ある項目のリストを取得したいですObservable<List<MyClassA>>次のように、

apiService.getListObservable() 
    .subscribeOn(Schedulers.io) 
    .observeOn(AndroidSchedulers.mainThread()); 

と私は出力をフィルタリングしたいと思いますので、私は上記に.filter()オペレータを追加しようとしたが、それだけでの代わりを必要とするようです私がチェックして許容できるオブジェクトはvalue2 == 10です。

私はRxJavaとRxJava2にはかなり新しく、ここで何か基本的なものが欠けているようですね。

TIAあなたがリストをアンロールして、フィルタを通過し、それらのエントリを収集でき

答えて

14

apiService.getListObservable() 
.subscribeOn(Schedulers.io) 
.flatMapIterable(new Function<List<MyClassA>, List<MyClassA>>() { 
    @Override public List<MyClassA> apply(List<MyClassA> v) { 
     return v; 
    } 
}) 
.filter(new Predicate<MyClassA>() { 
    @Override public boolean test(MyClassA v) { 
     return v.value2 == 10; 
    } 
}) 
.toList() 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(...); 
+0

ラムダをプリJava 8コードに拡張できますか? – Bootstrapper

+0

Flowableで動作しません –

0

あなたは以下を見てみましょうことがあります。フィルタされたオブジェクトだけを印刷する方法、またはフィルタされたオブジェクトを含むリストを印刷する方法を示します。ここで、フィルタリングロジックは、偶数が右にあるorg.apache.commons.lang3.tuple.Pairを保持することです。

public static void main(String[] args) { 
    // print raw output 
    getListObservable().subscribe(System.out::println); 

    // print the objects post filtering 
    getListObservable().flatMap(v -> Observable.from(v)).filter(p -> p.getRight()%2==0).subscribe(System.out::println); 

    // print the list refined with only filtered objects 
    getListObservable().flatMap(v -> Observable.just(v.stream().filter(p -> p.getRight()%2==0).collect(Collectors.toList()))).subscribe(System.out::println); 

} 

private static Observable<List<Pair<Integer, Integer>>> getListObservable() { 
    return Observable.create(subscriber -> { 
     for(int i=0; i<5; i++){ 
      List<Pair<Integer, Integer>> list = new ArrayList<>(); 
      for(int j=0; j<5; j++){ 
       list.add(Pair.of(i, j)); 
      } 
      subscriber.onNext(list); 
     } 
    }); 

} 

、観察の内容を出力:

[(0,0), (0,1), (0,2), (0,3), (0,4)] 
[(1,0), (1,1), (1,2), (1,3), (1,4)] 
[(2,0), (2,1), (2,2), (2,3), (2,4)] 
[(3,0), (3,1), (3,2), (3,3), (3,4)] 
[(4,0), (4,1), (4,2), (4,3), (4,4)] 

のみフィルタオブジェクトを格納するための出力:のみフィルタオブジェクトを含むリストを格納するための

(0,0) 
(0,2) 
(0,4) 
(1,0) 
(1,2) 
(1,4) 
(2,0) 
(2,2) 
(2,4) 
(3,0) 
(3,2) 
(3,4) 
(4,0) 
(4,2) 
(4,4) 

出力。

[(0,0), (0,2), (0,4)] 
[(1,0), (1,2), (1,4)] 
[(2,0), (2,2), (2,4)] 
[(3,0), (3,2), (3,4)] 
[(4,0), (4,2), (4,4)] 
関連する問題