Android从零开始学习Rxjava2(九)—— 条件和布尔运算符

条件和布尔运算符

评估Observables发出的一个或多个Observable或项目的运算符。

All

确定Observable发出的所有项目是否符合某些标准。
当且仅当源Observable正常终止并且源Observable发出的每个项根据都test计算为true时才返回true; 如果源Observable发出的任何项test计算为false,则返回false。
Android从零开始学习Rxjava2(九)—— 条件和布尔运算符_第1张图片
举个例子:

private void doSomeWork() {
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> observableEmitter) throws Exception {
                observableEmitter.onNext(0);
                observableEmitter.onNext(1);
//                observableEmitter.onError(new Throwable("Error"));
                observableEmitter.onNext(2);
                observableEmitter.onComplete();
            }
        }).all(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) throws Exception {
                return integer <= 3;
            }
        }).subscribe(new SingleObserver<Boolean>() {
            @Override
            public void onSubscribe(Disposable disposable) {

            }

            @Override
            public void onSuccess(Boolean aBoolean) {
                Log.d(TAG, " onSuccess : aBoolean : " + aBoolean);
            }

            @Override
            public void onError(Throwable throwable) {
                Log.d(TAG, " onError : " + throwable.getMessage());
            }
        });
    }

由于发射的所有数据都小于等于3,所以打印结果

onSuccess : aBoolean : true

需要注意的是All运算符,只有在源Observable正常终止才能返回Boolean,所以如果将上方例子中此段代码取消注释

observableEmitter.onError(new Throwable("Error"));

打印结果

onError : Error

Contains

确定Observable是否发出特定项目。
给Contains运算符传递特定项,如果源Observable发出该项,则它返回的Observable将发出true,如果源Observable终止而不发出该项,则返回false。
Android从零开始学习Rxjava2(九)—— 条件和布尔运算符_第2张图片
Contains运算符通过判断源发出的项是否有与特定的项equal的,来返回true和false。
举个例子:

public class Name {
        String name = "";

        public Name(String name) {
            this.name = name;
        }

        @Override
        public boolean equals(Object obj) {
            return (obj instanceof Name && name.equalsIgnoreCase(((Name) obj).name));
        }
    }

    private void doSomeWork() {
        Observable.just(new Name("张三"), new Name("李四"))
                .contains(new Name("张三"))
                .subscribe(new SingleObserver<Boolean>() {
                    @Override
                    public void onSubscribe(Disposable disposable) {

                    }

                    @Override
                    public void onSuccess(Boolean aBoolean) {
                        Log.d(TAG, " onSuccess : aBoolean : " + aBoolean);
                    }

                    @Override
                    public void onError(Throwable throwable) {
                        Log.d(TAG, " onError : " + throwable.getMessage());
                    }
                });
    }

由于重写Name的equals方法,所以contains实际是判断源发射的Name对象的name是否是张三,打印结果:

onSuccess : aBoolean : true

将上面示例代码注释掉这里再次执行

//        @Override
//        public boolean equals(Object obj) {
//            return (obj instanceof Name && name.equalsIgnoreCase(((Name) obj).name));
//        }

因为没有重写equals,所以contains比较的是两个对象,打印结果:

onSuccess : aBoolean : false

DefaultIfEmpty

从源Observable发出项,如果源Observable没有发出任何内容,则发出默认项。
如果源Observable发出任何项,则DefaultIfEmpty运算符只是精确镜像源Observable。 如果源Observable正常终止(使用onComplete)而没有发出任何项,则从DefaultIfEmpty返回的Observable将在它完成之前发出您选择的默认项。
Android从零开始学习Rxjava2(九)—— 条件和布尔运算符_第3张图片
这个操作符很好理解,如果正常发射的数据个数为0,则发射个默认的项。
举个例子:

private void doSomeWork() {
        Observable.fromIterable(new ArrayList<String>())
                .defaultIfEmpty("default")
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.d(TAG, " accept : s : " + s);
                    }
                });
    }

打印结果

accept : s : default

SequenceEqual

确定两个Observable是否发出相同的项目序列。
Android从零开始学习Rxjava2(九)—— 条件和布尔运算符_第4张图片
sequenceEqual操作符接受传递两个Observable参数,它会顺序比较两个Observable发射的数据,如果发射数据的序列是相同的(相同的数据,相同的顺序,相同的终止状态),则返回true,否则返回false。

最近两年比较懒,这篇文章还是去年年初缓存的草稿,也懒得再详细改了,就现在发出来算了.


参考资料,参考但不局限以下链接
http://reactivex.io/documentation/operators.html#transforming
https://blog.csdn.net/IO_Field/article/details/52452111

你可能感兴趣的:(rxjava2)