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版本