RxJava操作符(七)Conditional and Boolean
来源:互联网 发布:silk知乎 编辑:程序博客网 时间:2024/05/21 06:16
在这篇文章里我们来了解一下条件和布尔操作符。
一、All/Amb
All操作符根据一个函数对源Observable发射的所有数据进行判断,最终返回的结果就是这个判断结果。这个函数使用发射的数据作为参数,内部判断所有的数据是否满足我们定义好的判断条件,如果全部都满足则返回true,否则就返回false。
Amb操作符可以将至多9个Observable结合起来,让他们竞争。哪个Observable首先发射了数据(包括onError和onComplete)就会继续发射这个Observable的数据,其他的Observable所发射的数据都会别丢弃。
下面使用这两个操作符,对于all操作符我们做了这样的限制,初次使用的时候tag为false,会创建6个数字的Observable,以后都会创建5个数字的Observable。
分别进订阅
运行结果如下所示。第一次返回的6个数据的Observable不满足所有都小于6的条件,所以结果是false,以后的都满足条件,所以结果是true。使用amb操作符的Observable,第一个发射的数据的是7,所以输出了7,8,9,其他的数据都丢弃了。
二、Contains、IsEmpty
Contains操作符用来判断源Observable所发射的数据是否包含某一个数据,如果包含会返回true,如果源Observable已经结束了却还没有发射这个数据则返回false。
IsEmpty操作符用来判断源Observable是否发射过数据,如果发射过就会返回false,如果源Observable已经结束了却还没有发射这个数据则返回true。
用这两个操作符来判断一下两个Observable对象是否包含某个数据及是否为空
分别进行订阅
运行结果如下
三、DefaultIfEmpty
DefaultIfEmpty操作符会判断源Observable是否发射数据,如果源Observable发射了数据则正常发射这些数据,如果没有则发射一个默认的数据
下面我们用这个操作符来处理一个空的和一个非空的Observable,如果为空的话就返回默认值10
分别进行订阅
运行结果如下
四、SequenceEqual
SequenceEqual操作符用来判断两个Observable发射的数据序列是否相同(发射的数据相同,数据的序列相同,结束的状态相同),如果相同返回true,否则返回false
下面用SequenceEqual分别来判断两个相同的和不相同的Observable
分别进行订阅
运行结果如下
五、SkipUntil、SkipWhile
这两个操作符都是根据条件来跳过一些数据,不同之处在于SkipUnitl是根据一个标志Observable来判断的,当这个标志Observable没有发射数据的时候,所有源Observable发射的数据都会被跳过;当标志Observable发射了一个数据,则开始正常地发射数据。SkipWhile则是根据一个函数来判断是否跳过数据,当函数返回值为true的时候则一直跳过源Observable发射的数据;当函数返回false的时候则开始正常发射数据。
下面使用这两个操作符来跳过一些数据项。
分别进行订阅
运行结果如下
六、TakeUntil、TakeWhile
TakeUntil和TakeWhile操作符可以说和SkipUnitl和SkipWhile操作符是完全相反的功能。TakeUntil也是使用一个标志Observable是否发射数据来判断,当标志Observable没有发射数据时,正常发射数据,而一旦标志Observable发射过了数据则后面的数据都会被丢弃。TakeWhile则是根据一个函数来判断是否发射数据,当函数返回值为true的时候正常发射数据;当函数返回false的时候丢弃所有后面的数据。
下面使用这两个操作符来take两个Observable发射的数据
分别进行订阅
运行结果如下
关于条件和布尔操作符就到这了,本文中所有的demo程序见:https://github.com/Chaoba/RxJavaDemo
一、All/Amb
All操作符根据一个函数对源Observable发射的所有数据进行判断,最终返回的结果就是这个判断结果。这个函数使用发射的数据作为参数,内部判断所有的数据是否满足我们定义好的判断条件,如果全部都满足则返回true,否则就返回false。
Amb操作符可以将至多9个Observable结合起来,让他们竞争。哪个Observable首先发射了数据(包括onError和onComplete)就会继续发射这个Observable的数据,其他的Observable所发射的数据都会别丢弃。
下面使用这两个操作符,对于all操作符我们做了这样的限制,初次使用的时候tag为false,会创建6个数字的Observable,以后都会创建5个数字的Observable。
点击(此处)折叠或打开
- 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);
- }
点击(此处)折叠或打开
- mLButton.setText("all");
- mLButton.setOnClickListener(e-> allObserver().subscribe(i-> log("all:"+ i)));
- mRButton.setText("amb");
- mRButton.setOnClickListener(e-> ambObserver().subscribe(i-> log("amb:"+ i)));
二、Contains、IsEmpty
Contains操作符用来判断源Observable所发射的数据是否包含某一个数据,如果包含会返回true,如果源Observable已经结束了却还没有发射这个数据则返回false。
IsEmpty操作符用来判断源Observable是否发射过数据,如果发射过就会返回false,如果源Observable已经结束了却还没有发射这个数据则返回true。
用这两个操作符来判断一下两个Observable对象是否包含某个数据及是否为空
点击(此处)折叠或打开
- 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(newObservable.OnSubscribe<Integer>(){
- @Override
- public void call(Subscriber<?super Integer> subscriber){
- subscriber.onCompleted();
- }
- }).isEmpty();
- }
点击(此处)折叠或打开
- mLButton.setText("contains");
- mLButton.setOnClickListener(e-> containsObserver().subscribe(i-> log("contains:"+ i)));
- mRButton.setText("isEmpty");
- mRButton.setOnClickListener(e-> defaultObserver().subscribe(i-> log("isEmpty:"+ i)));
三、DefaultIfEmpty
DefaultIfEmpty操作符会判断源Observable是否发射数据,如果源Observable发射了数据则正常发射这些数据,如果没有则发射一个默认的数据
下面我们用这个操作符来处理一个空的和一个非空的Observable,如果为空的话就返回默认值10
点击(此处)折叠或打开
- private Observable<Integer> emptyObserver(){
- return Observable.create(newObservable.OnSubscribe<Integer>(){
- @Override
- public void call(Subscriber<?super Integer> subscriber){
- subscriber.onCompleted();
- }
- }).defaultIfEmpty(10);
- }
- private Observable<Integer> notEmptyObserver(){
- return Observable.create(newObservable.OnSubscribe<Integer>(){
- @Override
- public void call(Subscriber<?super Integer> subscriber){
- subscriber.onNext(1);
- subscriber.onCompleted();
- }
- }).defaultIfEmpty(10);
- }
点击(此处)折叠或打开
- mLButton.setText("empty");
- mLButton.setOnClickListener(e-> emptyObserver().subscribe(i-> log("empty:"+ i)));
- mRButton.setText("notEmpty");
- mRButton.setOnClickListener(e-> notEmptyObserver().subscribe(i-> log("notEmpty:"+ i)));
四、SequenceEqual
SequenceEqual操作符用来判断两个Observable发射的数据序列是否相同(发射的数据相同,数据的序列相同,结束的状态相同),如果相同返回true,否则返回false
下面用SequenceEqual分别来判断两个相同的和不相同的Observable
点击(此处)折叠或打开
- 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));
- }
点击(此处)折叠或打开
- mLButton.setText("equal");
- mLButton.setOnClickListener(e-> equalObserver().subscribe(i-> log("equal:"+ i)));
- mRButton.setText("notequal");
- mRButton.setOnClickListener(e-> notEqualObserver().subscribe(i-> log("notequal:"+ i)));
五、SkipUntil、SkipWhile
这两个操作符都是根据条件来跳过一些数据,不同之处在于SkipUnitl是根据一个标志Observable来判断的,当这个标志Observable没有发射数据的时候,所有源Observable发射的数据都会被跳过;当标志Observable发射了一个数据,则开始正常地发射数据。SkipWhile则是根据一个函数来判断是否跳过数据,当函数返回值为true的时候则一直跳过源Observable发射的数据;当函数返回false的时候则开始正常发射数据。
下面使用这两个操作符来跳过一些数据项。
点击(此处)折叠或打开
- 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);
- }
点击(此处)折叠或打开
- mLButton.setText("skipUntil");
- mLButton.setOnClickListener(e-> skipUntilObserver().subscribe(i-> log("skipUntil:"+ i)));
- mRButton.setText("skipWhile");
- mRButton.setOnClickListener(e-> skipWhileObserver().subscribe(i-> log("skipWhile:"+ i)));
六、TakeUntil、TakeWhile
TakeUntil和TakeWhile操作符可以说和SkipUnitl和SkipWhile操作符是完全相反的功能。TakeUntil也是使用一个标志Observable是否发射数据来判断,当标志Observable没有发射数据时,正常发射数据,而一旦标志Observable发射过了数据则后面的数据都会被丢弃。TakeWhile则是根据一个函数来判断是否发射数据,当函数返回值为true的时候正常发射数据;当函数返回false的时候丢弃所有后面的数据。
下面使用这两个操作符来take两个Observable发射的数据
点击(此处)折叠或打开
- 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);
- }
点击(此处)折叠或打开
- mLButton.setText("takeUntil");
- mLButton.setOnClickListener(e-> takeUntilObserver().subscribe(i-> log("takeUntil:"+ i)));
- mRButton.setText("takeWhile");
- mRButton.setOnClickListener(e-> takeWhileObserver().subscribe(i-> log("takeWhile:"+ i)));
关于条件和布尔操作符就到这了,本文中所有的demo程序见:https://github.com/Chaoba/RxJavaDemo
0 0
- RxJava操作符(七)Conditional and Boolean
- RxJava操作符(七)Conditional and Boolean
- RxJava操作符(七)Conditional and Boolean
- RxJava操作符(七)Conditional and Boolean
- RxJava操作符(七)Conditional and Boolean
- RxJava操作符——条件和布尔操作符(Conditional and Boolean Operators)
- RxJava(七) 使用debounce操作符 优化app搜索功能
- RxJava 学习笔记(七) --- Filtering 过滤操作
- Rxjava(2.操作符)
- [RxJava笔记]RxJava操作符
- Python 布尔操作(and/or,Boolean operator)与位操作(&/|,Bitwise operator)
- Android RxJava使用介绍(二) RxJava的操作符
- Android RxJava使用介绍(三) RxJava的操作符
- Android RxJava使用介绍(四) RxJava的操作符
- Android RxJava使用介绍(二) RxJava的操作符
- Android RxJava使用介绍(三) RxJava的操作符
- Android RxJava使用介绍(四) RxJava的操作符
- Android RxJava使用介绍(二) RxJava的操作符
- 排序算法
- 克服自己的困境
- 使用Python完成双色球的程序
- AVFoundation Programming Guide - About AVFoundation
- 每日一结,事务与连接池
- RxJava操作符(七)Conditional and Boolean
- 关于Java的反射机制,你需要理解这些..
- 搜索人生之五——13岁时我们有什么不一样
- linux g++编译时出现的.h.gch文件
- 第一篇博客:hello word
- 浅析EOF
- Machine Learning Notebook - Week 1 - Andrew Ng
- 史上最全最强SpringMVC详细示例实战教程
- java中的单例模式的饿汉式和懒汉式