您好,欢迎访问一九零五行业门户网

RxJava操作符(七)Conditional and Boolean_PHP教程

rxjava操作符(七)conditional and boolean在这篇文章里我们来了解一下条件和布尔操作符。
一、all/amb
all操作符根据一个函数对源observable发射的所有数据进行判断,最终返回的结果就是这个判断结果。这个函数使用发射的数据作为参数,内部判断所有的数据是否满足我们定义好的判断条件,如果全部都满足则返回true,否则就返回false。
amb操作符可以将至多9个observable结合起来,让他们竞争。哪个observable首先发射了数据(包括onerror和oncomplete)就会继续发射这个observable的数据,其他的observable所发射的数据都会别丢弃。
下面使用这两个操作符,对于all操作符我们做了这样的限制,初次使用的时候tag为false,会创建6个数字的observable,以后都会创建5个数字的observable。
private observable allobserver() {
observable 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 allobserver().subscribe(i -> log(all: + i)));
mrbutton.settext(amb);
mrbutton.setonclicklistener(e -> ambobserver().subscribe(i -> log(amb: + i)));
运行结果如下所示。第一次返回的6个数据的observable不满足所有都小于6的条件,所以结果是false,以后的都满足条件,所以结果是true。使用amb操作符的observable,第一个发射的数据的是7,所以输出了7,8,9,其他的数据都丢弃了。
二、contains、isempty
contains操作符用来判断源observable所发射的数据是否包含某一个数据,如果包含会返回true,如果源observable已经结束了却还没有发射这个数据则返回false。
isempty操作符用来判断源observable是否发射过数据,如果发射过就会返回false,如果源observable已经结束了却还没有发射这个数据则返回true。
用这两个操作符来判断一下两个observable对象是否包含某个数据及是否为空
private observable containsobserver() {
if (tag) {
return observable.just(1, 2, 3).contains(3);
}
tag = true;
return observable.just(1, 2, 3).contains(4);
}
private observable defaultobserver() {
return observable.create(new observable.onsubscribe() {
@override
public void call(subscriber 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 emptyobserver() {
return observable.create(new observable.onsubscribe() {
@override
public void call(subscriber subscriber) {
subscriber.oncompleted();
}
}).defaultifempty(10);
}
private observable notemptyobserver() {
return observable.create(new observable.onsubscribe() {
@override
public void call(subscriber 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 equalobserver() {
return observable.sequenceequal(observable.just(1, 2, 3), observable.just(1, 2, 3));
}
private observable 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 skipuntilobserver() {
return observable.interval(1, timeunit.seconds).skipuntil(observable.timer(3, timeunit.seconds));
}
private observable skipwhileobserver() {
return observable.interval(1, timeunit.seconds).skipwhile(along -> along 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 takeuntilobserver() {
return observable.interval(1, timeunit.seconds).takeuntil(observable.timer(3, timeunit.seconds));
}
private observable takewhileobserver() {
return observable.interval(1, timeunit.seconds).takewhile(along -> along takeuntilobserver().subscribe(i -> log(takeuntil: + i)));
mrbutton.settext(takewhile);
mrbutton.setonclicklistener(e -> takewhileobserver().subscribe(i -> log(takewhile: + i)));
运行结果如下
关于条件和布尔操作符就到这了,本文中所有的demo程序见:https://github.com/chaoba/rxjavademo
http://www.bkjia.com/phpjc/1077808.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/1077808.htmltecharticlerxjava操作符(七)conditional and boolean 在这篇文章里我们来了解一下条件和布尔操作符。 一、all/amb all操作符根据一个函数对源observable发射的...
其它类似信息

推荐信息