web-dev-qa-db-ja.com

RxJava2フィルターリスト<オブジェクト>

リスト内の各アイテム(オブジェクト)が検証チェックに合格するようにRxJava2でリストをフィルタリングしようとしていますが、そのテストに合格したアイテムのみを含む結果のリストが表示されます。たとえば、私のオブジェクトが次の構造を持っている場合、

_class MyClassA {
    int value1;
    int value2;
}
_

_value2_が10のアイテムのリストのみを取得したい。

Observable of Listを返すAPI呼び出し関数があります。つまり、次のように_Observable<List<MyClassA>>_です。

_apiService.getListObservable()
    .subscribeOn(Schedulers.io)
    .observeOn(AndroidSchedulers.mainThread());
_

出力をフィルタリングしたいので、上記に.filter()演算子を追加しようとしましたが、チェックして許可できるMyClassAオブジェクトだけでなく、_Predicate<List<MyClassA>>_が必要なようです。 _value2 == 10_の場合のみ。

私はRxJavaとRxJava2にかなり慣れていませんが、ここで基本的なものが欠けているようです。

TIA

7
Bootstrapper

リストを展開してから、フィルターを通過したエントリを収集できます。

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(...);
26
akarnokd

以下をご覧ください。フィルタリングされたオブジェクトのみを出力する方法を示しますORフィルタリングされたオブジェクトを含むリスト。ここでのフィルタリングロジックは、右側に偶数があるorg.Apache.commons.lang3.Tuple.Pairsを保持することです。

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)]
0
Pavan Kumar