首页 > 解决方案 > 如何使用 RxJava 过滤列表并将所有匹配的元素分组

问题描述

我有一个非常大的列表,想Filter在后台线程中对其执行简单的操作,然后在操作结束时获取与过滤条件匹配的结果列表。

我还是 RxJava 的新手,所以我很难让它发挥作用。我所拥有的是以下(充满largeList):ArrayListItem

    Observable
            .fromIterable(largeList)
            .filter { it.name.contains(query) }
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe { ... }

当 I 时subscribe,我会返回一个Item而不是通过过滤器的所有项目的完整列表。如何创建所有匹配结果的子列表?

标签: javaandroidrx-java

解决方案


使用 toList() 运算符。 toList 工作

对于给定的 Observable,它会将传入的排放收集到一个列表中,然后将整个列表作为单个排放推送(通过 Single>)。

 Observable
                .fromIterable(largeList)
                .filter { it.name.contains(query) }
                .toList() 
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe { ... }

此外,您可以选择指定一个整数参数作为容量提示,这将优化 ArrayList 的初始化以大致预期该数量的项目:

  Observable
                    .fromIterable(largeList)
                    .filter { it.name.contains(query) }
                    .toList(capacityHint)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeOn(Schedulers.io())
                    .subscribe { ... }

推荐阅读