RxJava操作符(七)Conditional and Boolean
2016-05-05 11:25
531 查看
在这篇文章里我们来了解一下条件和布尔操作符。
All操作符根据一个函数对源Observable发射的所有数据进行判断,最终返回的结果就是这个判断结果。这个函数使用发射的数据作为参数,内部判断所有的数据是否满足我们定义好的判断条件,如果全部都满足则返回true,否则就返回false。
![](http://reactivex.io/documentation/operators/images/all.png)
Amb操作符可以将至多9个Observable结合起来,让他们竞争。哪个Observable首先发射了数据(包括onError和onComplete)就会继续发射这个Observable的数据,其他的Observable所发射的数据都会别丢弃。
![](http://reactivex.io/documentation/operators/images/amb.png)
下面使用这两个操作符,对于all操作符我们做了这样的限制,初次使用的时候tag为false,会创建6个数字的Observable,以后都会创建5个数字的Observable。
分别进订阅
运行结果如下所示。第一次返回的6个数据的Observable不满足所有都小于6的条件,所以结果是false,以后的都满足条件,所以结果是true。使用amb操作符的Observable,第一个发射的数据的是7,所以输出了7,8,9,其他的数据都丢弃了。
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928114546.png)
Contains操作符用来判断源Observable所发射的数据是否包含某一个数据,如果包含会返回true,如果源Observable已经结束了却还没有发射这个数据则返回false。
![](http://reactivex.io/documentation/operators/images/contains.png)
IsEmpty操作符用来判断源Observable是否发射过数据,如果发射过就会返回false,如果源Observable已经结束了却还没有发射这个数据则返回true。
![](http://reactivex.io/documentation/operators/images/isEmpty.png)
用这两个操作符来判断一下两个Observable对象是否包含某个数据及是否为空
分别进行订阅
运行结果如下
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928162153.png)
DefaultIfEmpty操作符会判断源Observable是否发射数据,如果源Observable发射了数据则正常发射这些数据,如果没有则发射一个默认的数据
![](http://reactivex.io/documentation/operators/images/defaultIfEmpty.png)
下面我们用这个操作符来处理一个空的和一个非空的Observable,如果为空的话就返回默认值10
分别进行订阅
运行结果如下
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928163931.png)
SequenceEqual操作符用来判断两个Observable发射的数据序列是否相同(发射的数据相同,数据的序列相同,结束的状态相同),如果相同返回true,否则返回false
![](http://reactivex.io/documentation/operators/images/sequenceEqual.png)
下面用SequenceEqual分别来判断两个相同的和不相同的Observable
分别进行订阅
运行结果如下
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928170106.png)
这两个操作符都是根据条件来跳过一些数据,不同之处在于SkipUnitl是根据一个标志Observable来判断的,当这个标志Observable没有发射数据的时候,所有源Observable发射的数据都会被跳过;当标志Observable发射了一个数据,则开始正常地发射数据。
![](http://reactivex.io/documentation/operators/images/skipUntil.png)
SkipWhile则是根据一个函数来判断是否跳过数据,当函数返回值为true的时候则一直跳过源Observable发射的数据;当函数返回false的时候则开始正常发射数据。
![](http://reactivex.io/documentation/operators/images/skipWhile.png)
下面使用这两个操作符来跳过一些数据项。
分别进行订阅
运行结果如下
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928171606.png)
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928171956.png)
TakeUntil和TakeWhile操作符可以说和SkipUnitl和SkipWhile操作符是完全相反的功能。TakeUntil也是使用一个标志Observable是否发射数据来判断,当标志Observable没有发射数据时,正常发射数据,而一旦标志Observable发射过了数据则后面的数据都会被丢弃。
![](http://reactivex.io/documentation/operators/images/takeUntil.png)
TakeWhile则是根据一个函数来判断是否发射数据,当函数返回值为true的时候正常发射数据;当函数返回false的时候丢弃所有后面的数据。
![](http://reactivex.io/documentation/operators/images/takeWhile.png)
下面使用这两个操作符来take两个Observable发射的数据
分别进行订阅
运行结果如下
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928172756.png)
关于条件和布尔操作符就到这了,本文的demo程序见github
#RxJava
一、All/Amb
All操作符根据一个函数对源Observable发射的所有数据进行判断,最终返回的结果就是这个判断结果。这个函数使用发射的数据作为参数,内部判断所有的数据是否满足我们定义好的判断条件,如果全部都满足则返回true,否则就返回false。![](http://reactivex.io/documentation/operators/images/all.png)
Amb操作符可以将至多9个Observable结合起来,让他们竞争。哪个Observable首先发射了数据(包括onError和onComplete)就会继续发射这个Observable的数据,其他的Observable所发射的数据都会别丢弃。
![](http://reactivex.io/documentation/operators/images/amb.png)
下面使用这两个操作符,对于all操作符我们做了这样的限制,初次使用的时候tag为false,会创建6个数字的Observable,以后都会创建5个数字的Observable。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | private Observable<Boolean> allObserver() { Observable<Integer> just; if (tag) { just = Observable.just(1, 2, 3, 4, 5); } else { just = Observable.just(1, 2, 3, 4, 5, 6); } tag = true; return just.all(integer -> integer < 6); } private Observable<Integer> ambObserver() { Observable<Integer> delay3 = Observable.just(1, 2, 3).delay(3000, TimeUnit.MILLISECONDS); Observable<Integer> delay2 = Observable.just(4, 5, 6).delay(2000, TimeUnit.MILLISECONDS); Observable<Integer> delay1 = Observable.just(7, 8, 9).delay(1000, TimeUnit.MILLISECONDS); return Observable.amb(delay1, delay2, delay3); } |
1 2 3 4 | mLButton.setText("all"); mLButton.setOnClickListener(e -> allObserver().subscribe(i -> log("all:" + i))); mRButton.setText("amb"); mRButton.setOnClickListener(e -> ambObserver().subscribe(i -> log("amb:" + i))); |
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928114546.png)
二、Contains、IsEmpty
Contains操作符用来判断源Observable所发射的数据是否包含某一个数据,如果包含会返回true,如果源Observable已经结束了却还没有发射这个数据则返回false。![](http://reactivex.io/documentation/operators/images/contains.png)
IsEmpty操作符用来判断源Observable是否发射过数据,如果发射过就会返回false,如果源Observable已经结束了却还没有发射这个数据则返回true。
![](http://reactivex.io/documentation/operators/images/isEmpty.png)
用这两个操作符来判断一下两个Observable对象是否包含某个数据及是否为空
1 2 3 45 | private Observable<Boolean> containsObserver() { if (tag) { return Observable.just(1, 2, 3).contains(3); } tag = true; return Observable.just(1, 2, 3).contains(4); } private Observable<Boolean> defaultObserver() { return Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { subscriber.onCompleted(); } }).isEmpty(); } |
1 2 3 4 | mLButton.setText("contains"); mLButton.setOnClickListener(e -> containsObserver().subscribe(i -> log("contains:" + i))); mRButton.setText("isEmpty"); mRButton.setOnClickListener(e -> defaultObserver().subscribe(i -> log("isEmpty:" + i))); |
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928162153.png)
三、DefaultIfEmpty
DefaultIfEmpty操作符会判断源Observable是否发射数据,如果源Observable发射了数据则正常发射这些数据,如果没有则发射一个默认的数据![](http://reactivex.io/documentation/operators/images/defaultIfEmpty.png)
下面我们用这个操作符来处理一个空的和一个非空的Observable,如果为空的话就返回默认值10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1718 | private Observable<Integer> emptyObserver() { return Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { subscriber.onCompleted(); } }).defaultIfEmpty(10); } private Observable<Integer> notEmptyObserver() { return Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { subscriber.onNext(1); subscriber.onCompleted(); } }).defaultIfEmpty(10); } |
1 2 3 4 | mLButton.setText("empty"); mLButton.setOnClickListener(e -> emptyObserver().subscribe(i -> log("empty:" + i))); mRButton.setText("notEmpty"); mRButton.setOnClickListener(e -> notEmptyObserver().subscribe(i -> log("notEmpty:" + i))); |
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928163931.png)
四、SequenceEqual
SequenceEqual操作符用来判断两个Observable发射的数据序列是否相同(发射的数据相同,数据的序列相同,结束的状态相同),如果相同返回true,否则返回false![](http://reactivex.io/documentation/operators/images/sequenceEqual.png)
下面用SequenceEqual分别来判断两个相同的和不相同的Observable
1 2 3 45 | private Observable<Boolean> equalObserver() { return Observable.sequenceEqual(Observable.just(1, 2, 3), Observable.just(1, 2, 3)); } private Observable<Boolean> notEqualObserver() { return Observable.sequenceEqual(Observable.just(1, 2, 3), Observable.just(1, 2)); } |
1 2 3 4 | mLButton.setText("equal"); mLButton.setOnClickListener(e -> equalObserver().subscribe(i -> log("equal:" + i))); mRButton.setText("notequal"); mRButton.setOnClickListener(e -> notEqualObserver().subscribe(i -> log("notequal:" + i))); |
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928170106.png)
五、SkipUntil、SkipWhile
这两个操作符都是根据条件来跳过一些数据,不同之处在于SkipUnitl是根据一个标志Observable来判断的,当这个标志Observable没有发射数据的时候,所有源Observable发射的数据都会被跳过;当标志Observable发射了一个数据,则开始正常地发射数据。![](http://reactivex.io/documentation/operators/images/skipUntil.png)
SkipWhile则是根据一个函数来判断是否跳过数据,当函数返回值为true的时候则一直跳过源Observable发射的数据;当函数返回false的时候则开始正常发射数据。
![](http://reactivex.io/documentation/operators/images/skipWhile.png)
下面使用这两个操作符来跳过一些数据项。
1 2 3 45 | private Observable<Long> skipUntilObserver() { return Observable.interval(1, TimeUnit.SECONDS).skipUntil(Observable.timer(3, TimeUnit.SECONDS)); } private Observable<Long> skipWhileObserver() { return Observable.interval(1, TimeUnit.SECONDS).skipWhile(aLong -> aLong < 5); } |
1 2 3 4 | mLButton.setText("skipUntil"); mLButton.setOnClickListener(e -> skipUntilObserver().subscribe(i -> log("skipUntil:" + i))); mRButton.setText("skipWhile"); mRButton.setOnClickListener(e -> skipWhileObserver().subscribe(i -> log("skipWhile:" + i))); |
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928171606.png)
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928171956.png)
六、TakeUntil、TakeWhile
TakeUntil和TakeWhile操作符可以说和SkipUnitl和SkipWhile操作符是完全相反的功能。TakeUntil也是使用一个标志Observable是否发射数据来判断,当标志Observable没有发射数据时,正常发射数据,而一旦标志Observable发射过了数据则后面的数据都会被丢弃。![](http://reactivex.io/documentation/operators/images/takeUntil.png)
TakeWhile则是根据一个函数来判断是否发射数据,当函数返回值为true的时候正常发射数据;当函数返回false的时候丢弃所有后面的数据。
![](http://reactivex.io/documentation/operators/images/takeWhile.png)
下面使用这两个操作符来take两个Observable发射的数据
1 2 3 45 | private Observable<Long> takeUntilObserver() { return Observable.interval(1, TimeUnit.SECONDS).takeUntil(Observable.timer(3, TimeUnit.SECONDS)); } private Observable<Long> takeWhileObserver() { return Observable.interval(1, TimeUnit.SECONDS).takeWhile(aLong -> aLong < 5); } |
1 2 3 4 | mLButton.setText("takeUntil"); mLButton.setOnClickListener(e -> takeUntilObserver().subscribe(i -> log("takeUntil:" + i))); mRButton.setText("takeWhile"); mRButton.setOnClickListener(e -> takeWhileObserver().subscribe(i -> log("takeWhile:" + i))); |
![](http://7xp3vb.com1.z0.glb.clouddn.com/20150928172756.png)
关于条件和布尔操作符就到这了,本文的demo程序见github
#RxJava
相关文章推荐
- JAVA中常用集合
- java反射:使用asm获取方法的参数名
- RxJava操作符(六)Utility
- eclipse的快捷键(常用)
- 精选30道Java笔试题解答
- java 反射机制修改的导出
- RxJava操作符(五)Error Handling
- Java books list
- IT十八掌作业_java基础第四天_复习运算符、进制转化和数组
- 第二章 Spring MVC入门
- Java自动装箱的陷阱
- RxJava操作符(四)Combining
- 定义Java中的方法
- Groovy Tutorial for Java Developers – Part 1: The Basics
- JDK源码学习(4)-java.util.HashMap、LinkedHashMap与TreeMap
- Java并发编程 线程池
- WebService与Spring整合《三》
- RxJava操作符(三)Filtering
- 为什么java有垃圾回收机制,还有close方法?
- java 线程thread2(线程同步 synchronized)