Rxjava2 any操作符

218 阅读1分钟

any操作符的作用是只要有数据满足条件就可以通过,与all操作符相反。all操作符需要所有数据都要满足。

Observable.just(11, 12, 13, 14, 15)
                .any(Functions.equalsWith(15))
                .subscribe(System.out::println);

返回的结果为true,例子中表示的是只有数据中有与15相等的就可以。 看源码是如何实现的,因为大部分源码与all操作符类似,就简单讲解最核心的部分,我们看看事件再哪里被测试了。

static final class AnyObserver<T> implements Observer<T>, Disposable {

       ...

        @Override
        public void onNext(T t) {
            if (done) {
                return;
            }
            boolean b;
            try {
                //每一个数据在这检测,只要检测到true,也就是我们例子中等于15的条件
        
                b = predicate.test(t);
            } catch (Throwable e) {
                Exceptions.throwIfFatal(e);
                upstream.dispose();
                onError(e);
                return;
            }
            
            if (b) {
                //检测成功,说明有数据满足了我们的条件,可能提前结束
                done = true;
                upstream.dispose();
                //发出true事件
                downstream.onSuccess(true);
            }
        }

        @Override
        public void onError(Throwable t) {
            if (done) {
                RxJavaPlugins.onError(t);
                return;
            }

            done = true;
             //出现异常,发出失败事件
            downstream.onError(t);
        }

        @Override
        public void onComplete() {
            if (!done) {
                done = true;
                //如果到这了,说明我们的数据中没有一个数据满足条件,发出false
                downstream.onSuccess(false);
            }
        }

       ...
    }

基于源码2.2.4版本