java - 如何使用 RxJava2 过滤 Arraylist

标签 java android arraylist rx-java2

想要使用 RxJava2 过滤列表。不知何故让它工作。但概率是,它在 Consumer 回调中仅返回列表中的 一个 项(大小始终为 1)

代码如下:

 Observable.fromIterable(arraylist)
                   .filter(new Predicate<BasicListModel>() {
                       @Override
                       public boolean test(BasicListModel model) throws Exception {
                           return true; //returning true for all items in filter
                       }
                   })
                   .toList()
                   .observeOn(Schedulers.computation())
                   .subscribe(new Consumer<List<BasicListModel>>() {
                       @Override
                       public void accept(List<BasicListModel> models) throws Exception {

                               Log.i("TAG"," size:"+models.size());

                       }
                   });

我是 RxJAva1 或 RxJava2 的新手。

最佳答案

您可以按照以下方式使用适当的迭代进行过滤

Observable.fromIterable(offerBasicListModel)
            .observeOn(Schedulers.computation())
            .filter(new Predicate<BasicListModel>() {
                @Override
                public boolean test(BasicListModel model) throws Exception {

                    if (model.isDownloading()) //assume
                        return true; // if true, object will redirect to `doOnNext`
                    else
                        return false;
                }
            })
            .doOnNext(new Consumer<BasicListModel>() {
                @Override
                public void accept(BasicListModel model) throws Exception {
                    Log.d("objects one by one ->",model.getId());
                }
            })
            .toList()
            .subscribe(new Consumer<List<BasicListModel>>() {
                @Override
                public void accept(List<BasicListModel> model) throws Exception {
                    Log.d(TAG, "filtered list size: "+model.size());
                }
            });

如果你支持java 8,那么

Observable.fromIterable(offerBasicListModel)
            .observeOn(Schedulers.computation())
            .filter(BasicListModel::isDownloading)
            .doOnNext(
            model ->Log.d(TAG,"filtered objects one by one ->",model.getId())
            )
            .toList()
            .subscribe(model -> Log.d(TAG, "filtered list size: "+model.size()));

更新

Custom User model

public class UserModel {

private int age;
private String name;

public UserModel(int age, String name) {
    this.age = age;
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
} 
}

perform filtering user with age above 18

ArrayList<UserModel> userModelArrayList = new ArrayList<>();
    UserModel user;
    for (int i = 0; i < 20; i++) {
        if (i % 2 == 0)
            user = new UserModel(25, "user" + i);
        else
            user = new UserModel(15, "user" + i);

        userModelArrayList.add(user);
    }

    io.reactivex.Observable
            .fromIterable(userModelArrayList)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.computation())
            .filter(userModel -> userModel.getAge() > 18)
            .toList()
            .subscribe(new SingleObserver<List<UserModel>>() {
                @Override
                public void onSubscribe(Disposable d) {
                    /* to do */
                }

                @Override
                public void onSuccess(List<UserModel> userModels) {
                    Log.d("userModels", " after filtering: " + userModels.size());

                }

                @Override
                public void onError(Throwable e) {
                    /* to do */
                }
            });

在这里,我能够在 onSuccess() 中实现 10 个过滤的用户对象。

我建议您首先使用示例代码尝试这种方法,如果它有效,然后您可以修改并跟踪您做错的地方。

Result

关于java - 如何使用 RxJava2 过滤 Arraylist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48764175/

相关文章:

java - 数组 XML 编码

java - 将字符串内容键/值对映射到 HashMap

android - 按钮与 ListView 的数据重叠

java - 位图到 byte[] 到位图(不压缩)

java - 尝试限制 Number 类的上限而不为整个类实现 Comparable

java - java中int数组到Integer数组列表的转换

java - 遍历java中的对象列表

java - 为什么Tuckey UrlRewrite Filter在规则匹配后不调用chain.doFilter?

java - 使用准备好的语句在 Oracle 中生成日期

android - gradlew assemble 和 gradlew compile 有什么区别