美文网首页
Rxjava Any

Rxjava Any

作者: CODERLIHAO | 来源:发表于2018-12-17 16:11 被阅读0次

所有代码的演示都在RxJava2.2.4版本上进行的

判断数据是否有满足条件的

1.example

          Observable.just(11, 12, 13, 14, 15)
                .any(Functions.equalsWith(15))
                .subscribe(result -> Logger.getGlobal().info("result:" + result));

2.源码分析

 public final Single<Boolean> any(Predicate<? super T> predicate) {
        ObjectHelper.requireNonNull(predicate, "predicate is null");
        return RxJavaPlugins.onAssembly(new ObservableAnySingle<T>(this, predicate));
    }

调用any会产生Single,只发射单个数据或错误事件。
Predicate的实现类,Predicate接口比较简单,测试一下给定数据


Predicate.png
public interface Predicate<T> {
    /**
     * Test the given input value and return a boolean.
     * @param t the value
     * @return the boolean result
     * @throws Exception on error
     */
    boolean test(@NonNull T t) throws Exception;
}

看看subscribe方法

    public final Disposable subscribe(final Consumer<? super T> onSuccess, final Consumer<? super Throwable> onError) {
        ObjectHelper.requireNonNull(onSuccess, "onSuccess is null");
        ObjectHelper.requireNonNull(onError, "onError is null");

        ConsumerSingleObserver<T> observer = new ConsumerSingleObserver<T>(onSuccess, onError);
        subscribe(observer);
        return observer;
    }

构造一个ConsumerSingleObserver返回,
ConsumerSingleObserver中有2个属性,看的出Single只关心要么成功,要么失败

 final Consumer<? super T> onSuccess;

 final Consumer<? super Throwable> onError;

在这个demo中调用subscribe实际上触发ObservableAnySingle实例的subscribeActual方法

 protected void subscribeActual(SingleObserver<? super Boolean> t) {
        source.subscribe(new AnyObserver<T>(t, predicate));
    }

这里的source就是ConsumerSingleObserver的实例
重点来分析

   static final class AnyObserver<T> implements Observer<T>, Disposable {
        //downstream就是上面的ConsumerSingleObserver实例
        final SingleObserver<? super Boolean> downstream;
        //predicate就是Functions.equalsWith(15)的实例
        final Predicate<? super T> predicate;

        Disposable upstream;

        boolean done;

        AnyObserver(SingleObserver<? super Boolean> actual, Predicate<? super T> predicate) {
            this.downstream = actual;
            this.predicate = predicate;
        }

        @Override
        public void onSubscribe(Disposable d) {
            if (DisposableHelper.validate(this.upstream, d)) {
                this.upstream = d;
                downstream.onSubscribe(this);
            }
        }

        @Override
        public void onNext(T t) {
            if (done) {
              //已经断言成功,直接返回
                return;
            }
            boolean b;
            try {
              //重点在这
                b = predicate.test(t);
            } catch (Throwable e) {
                Exceptions.throwIfFatal(e);
                upstream.dispose();
                onError(e);
                return;
            }
            if (b) {
                done = true;
                upstream.dispose();
                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;
                downstream.onSuccess(false);
            }
        }

        @Override
        public void dispose() {
            upstream.dispose();
        }

        @Override
        public boolean isDisposed() {
            return upstream.isDisposed();
        }
    }

onNext方法每次都给被调用,首次先检查是否已经完成,因为比如有[1,2,3,4,5,6,7,8,9]数据,
你想检查是否含有10,显然没有,数据会经过1,2,3,4...一直到9,最后都没有10,此时的
done == false,数据已经结束,调用onComplete,返回false;如果你想检查2,数据到1,发现
测试失败,然后到2,测试成功,done == true,上流upstream就会停止

相关文章

  • Rxjava Any

    所有代码的演示都在RxJava2.2.4版本上进行的 判断数据是否有满足条件的 1.example 2.源码分析 ...

  • Rxjava contains

    所有代码的演示都在RxJava2.2.4版本上进行的 contains调用的是any操作符,Any参考

  • Rxjava All

    所有代码的演示都在RxJava2.2.4版本上进行的 所有数据都满足指定条件才会返回true,与Any相反 调用a...

  • any

    有时候我会花很长的时间去想个名字,微信的、微博的、QQ的。。。,想好了,就改了,然后过了一段时间我会发现我又不喜欢...

  • any

    i can put you. loving we are do the mosten we should meet...

  • 2020-03-18python版本类型注释

    def assertEquals(self, first: Any, second: Any, msg: Any ...

  • 无标题文章

    [TOC] 什么是rxjava 什么是rxjava 什么是rxjava 什么是rxjava 什么是rxjava 什...

  • python any()和all()用法

    any()用法: any(...) any(iterable) -> bool Return True if bo...

  • Kiss me hug me don't leave me ph

    Any time, any place, any day of the year can be a great m...

  • RxJava2

    一、RxJava GitHub: RxJava2Demo 二、RxJava的概念 RxJava RxAndroid...

网友评论

      本文标题:Rxjava Any

      本文链接:https://www.haomeiwen.com/subject/bdfckqtx.html