在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相对应的数据&#