RxJava之条件和布尔操作符

在RxJava中,条件和布尔操作符作用于Observable中数据源,比如数据源中的数据是否满足某种条件,或者 数据源是否为空,又或者数据源为空时如何发射备份数据。在过滤操作符 曾了解take、skip操作符的使用,我们是否为它们设定一定的执行的条件呢?

all

流程图

这里写图片描述

概述

all操作符判定原Observable发射的所有数据是否全部满足满足某个条件。

all操作符接收一个函数参数,创建并返回一个单布尔值的Observable,如果原Observable正常终止并且每一项数据都满足条件,就返回true;如果原Observable的任何一项数据不满足条件或者非正常终止就返回False。

all操作符默认不在任何特定的调度器上执行。

API

Javadoc: all(Func1)

示例代码

Observable.from(getListOfStudent())
        .subscribeOn(Schedulers.io())
        .all(new Func1<Student, Boolean>() {
            @Override
            public Boolean call(Student student) {
                return student.getAge() > 16 && stutdent.getAge() < 40;
            }
        }).observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<Boolean>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Boolean aBoolean) {
                Log.i(TAG, "all(): " + aBoolean);

            }
        });

Log打印

all(): true

示例解析

示例中,对Observable发射的每一个数据,即Student对象,通过all操作符来判定每个Student对象的成员变量age是否在16至40之间,此时all操作符创建并一个单布尔值的Observabl。细看Log打印,观察者订阅后,收到一个Boolean数据,其值为true,表明原Observable可以正常终止,而且发射的每一项数据都满足需求条件。

amb

流程图

这里写图片描述

概述

amb操作符对于给定两个或多个Observables,它只发射首先发射数据或通知的那个Observable的所有数据。

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

RxJava的实现是amb操作符时,有一个类似的对象方法ambWith。例如,Observable.amb(o1,o2)和o1.ambWith(o2)是等价的。

该操作符操作符默认不在任何特定的调度器上执行。

API

Javadoc: amb(T o1, T ... o2)(可接受2到9个参数)

示例代码

Observable.amb(Observable.just(new Student(1001, "amb - 1", 20)).delay(2, TimeUnit.SECONDS),
                                Observable.just(new Student(1002, "amb - 2", 21)))
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<Student>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Student student) {
                mAdaStudent.addData(student);
                Log.i(TAG, student.toString());
            }
        });

Log打印

Student{id='1002'name='amb - 2', age=21}

示例解析

从示例代码中,传递给amb操作符两个Observable,但是第一个Observable通过delay操作符,将其延迟2S发射数据,而第二个未做延迟处理。因此,amb操作符首先收到的是第二个Observable发射的数据。从amb概述中可知,amb操作符将丢弃第一个Observable中的数据,只发射第二个的数据。从Log打印 中,可以看出只打印了与第二个Observable相对应的数据&#

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值