RX操作之条件和布操作符(amb、defaultIfEmpty、skipUntil、skipWhile、takeUntil、takeWhile、contains、all、exists、isEmpty)

一、amb

当你传递多个Observable给Amb时,它只发射其中一个Observable的数据和通知:首先发送通知给Amb的那个,不管发射的是一项数据还是一个onErroronCompleted通知。Amb将忽略和丢弃其它所有Observables的发射物。

Long[]items = {6l,7l,8l,9l,10l};
        Observable<Long> observable = Observable.interval(2, TimeUnit.SECONDS).take(5);
        Observable<Long> observable1 = Observable.from(items);

        Subscriber<Long> subscriber = new Subscriber<Long>() {

            @Override
            public void onNext(Long v) {
                Log.e(TAG, "onNext................." + v);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        Observable.amb(observable,observable1).subscribe(subscriber);

运行结果:


二、defaultIfEmpty

发射来自原始Observable的值,如果原始Observable没有发射任何值,就发射一个默认值。DefaultIfEmpty简单的精确地发射原始Observable的值,如果原始Observable没有发射任何数据正常终止(以onCompletedd的形式),DefaultIfEmpty返回的Observable就发射一个你提供的默认值。

Long[]items ={};
        Observable<Long> observable = Observable.from(items);

        Subscriber<Long> subscriber = new Subscriber<Long>() {

            @Override
            public void onNext(Long v) {
                if(v == 1000){
                    Log.e(TAG, "onNext.................发射了默认的值:" + v);

                }else {
                    Log.e(TAG, "onNext................." + v);
                }
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        observable.defaultIfEmpty(1000l).subscribe(subscriber);

运行结果:


三、skipUntil

丢弃原始Observable发射的数据,直到第二个Observable发射了一项数据

 //所需发射的数据,在observable1发射之前的数据将会被丢失
        Observable <Long> observable = Observable.interval(2,TimeUnit.SECONDS).take(5);
        //当此observale发射数据时,observable的数据才会被传递到onNext中
        Observable <Long> observable1 = Observable.interval(5,TimeUnit.SECONDS).take(5);

        Subscriber<Long> subscriber = new Subscriber<Long>() {
            @Override
            public void onNext(Long v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        observable
                .skipUntil(observable1)
                .subscribe(subscriber);
运行结果:



四、skipWhile

当条件不满足时执行,SkipWhile订阅原始的Observable,但是忽略它的发射物,直到你指定的某个条件变为false的那一刻,它开始发射原始Observable。

Observable <Long> observable = Observable.interval(2,TimeUnit.SECONDS).take(5);
        Subscriber<Long> subscriber = new Subscriber<Long>() {
            @Override
            public void onNext(Long v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        observable
                .skipWhile(new Func1<Long, Boolean>() {
                    @Override
                    public Boolean call(Long aLong) {
                        return aLong < 4;
                    }
                })
                .subscribe(subscriber);
执行结果:



五、takeUntil

当第二个Observable发射了一项数据或者终止时,丢弃原始Observable发射的任何数据。TakeUntil订阅并开始发射原始Observable,它还监视你提供的第二个Observable。如果第二个Observable发射了一项数据或者发射了一个终止通知,TakeUntil返回的Observable会停止发射原始Observable并终止。

注:第二个Observable发射一项数据或一个onError通知或一个onCompleted通知都会导致takeUntil停止发射数据

//所需发射的数据,在observable1发射后数据将会被丢失
        Observable <Long> observable = Observable.interval(2,TimeUnit.SECONDS).take(5);
        //当此observale发射数据时,observable的数据还未被发射的将会被丢失
        Observable <Long> observable1 = Observable.interval(5,TimeUnit.SECONDS).take(5);

        Subscriber<Long> subscriber = new Subscriber<Long>() {
            @Override
            public void onNext(Long v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        observable
                .takeUntil(observable1)
                .subscribe(subscriber);
运行结果:



六、takeWhile

发射Observable发射的数据,直到一个指定的条件不成立。TakeWhile发射原始Observable,直到你指定的某个条件不成立的那一刻,它停止发射原始Observable,并终止自己的Observable。takeWhile操作符返回一个镜像原始Observable行为的Observable,直到某一项数据你指定的函数返回false那一刻,这个新的Observable发射onCompleted终止通知。

 Observable <Long> observable = Observable.interval(1,TimeUnit.SECONDS).take(5);

        Subscriber<Long> subscriber = new Subscriber<Long>() {
            @Override
            public void onNext(Long v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        observable
                .takeWhile(new Func1<Long, Boolean>() {
                    @Override
                    public Boolean call(Long aLong) {
                        return aLong<4;
                    }
                })
                .subscribe(subscriber);

运行结果:


七、all

判断是否所发射的所有数据都满足某个条件

 Observable <Long> observable = Observable.interval(1,TimeUnit.SECONDS).take(5);

        Subscriber<Boolean> subscriber = new Subscriber<Boolean>() {
            @Override
            public void onNext(Boolean v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        observable
                .all(new Func1<Long, Boolean>() {
                    @Override
                    public Boolean call(Long aLong) {
                        return aLong > 4;
                    }
                })
                .subscribe(subscriber);


运行结果:



八、contains

判断所发射的数据是否包含某个值

 Observable <Integer> observable = Observable.just(1, 2, 3, 4, 5);

        Subscriber<Boolean> subscriber = new Subscriber<Boolean>() {
            @Override
            public void onNext(Boolean v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        observable
                .contains(4)
                .subscribe(subscriber);

运行结果:



九、exists

只要有任何一项满足条件就返回true

 Observable <Integer> observable = Observable.just(1, 2, 3, 4, 5);

        Subscriber<Boolean> subscriber = new Subscriber<Boolean>() {
            @Override
            public void onNext(Boolean v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        observable
                .exists(new Func1<Integer, Boolean>() {
                    @Override
                    public Boolean call(Integer integer) {
                        return integer >=5;
                    }
                })
                .subscribe(subscriber);

运行结果:


十、isEmpty

判断所发射的Observable是否为空

 Observable <Integer> observable = Observable.just(1, 2, 3, 4, 5);

        Subscriber<Boolean> subscriber = new Subscriber<Boolean>() {
            @Override
            public void onNext(Boolean v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        observable
                .isEmpty()
                .subscribe(subscriber);
运行结果:



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值