【问题标题】:RxJava2 filter List<Object>RxJava2 过滤器列表<对象>
【发布时间】:2017-02-13 22:50:41
【问题描述】:

我正在尝试使用 RxJava2 过滤列表,以便列表中的每个项目(对象)都应该通过验证检查,并且我得到一个结果列表,其中只有通过该测试的项目。例如,如果我的对象具有以下结构,

class MyClassA {
    int value1;
    int value2;
}

我只想获取 value2 为 10 的项目列表。

我有一个 API 调用函数,它返回 List 的 Observable,即Observable&lt;List&lt;MyClassA&gt;&gt;,如下所示,

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

我想过滤输出,所以我尝试在上面添加一个 .filter() 运算符,但它似乎需要一个 Predicate&lt;List&lt;MyClassA&gt;&gt; 而不仅仅是一个 MyClassA 对象,我可以使用它检查并只允许value2 == 10.

我对 RxJava 和 RxJava2 还是很陌生,似乎在这里缺少一些基本的东西?

TIA

【问题讨论】:

    标签: java rx-java rx-android rx-java2


    【解决方案1】:

    您可以展开列表,然后收集通过过滤器的条目:

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

    【讨论】:

    • 能否将 lambda 扩展为 Java 8 之前的代码?以这种方式看待它真的会有所帮助
    【解决方案2】:

    你可以看看下面的。它演示了仅打印过滤对象或包含过滤对象的列表的方法。这里的过滤逻辑是保留右边有偶数的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)]
    

    【讨论】:

      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 2022-01-12
      • 2011-10-21
      • 2017-10-27
      • 2021-12-20
      • 2015-03-24
      • 2011-01-10
      相关资源
      最近更新 更多