RxJava操作符系列傳送門
RxJava操作符源碼
RxJava操作符系列一
RxJava操作符系列二
RxJava操作符系列三
RxJava操作符系列四
RxJava操作符系列五
前言
在上幾篇文章我們介紹了一些RxJava創(chuàng)建合呐,轉(zhuǎn)換暮的,過濾,組合淌实,輔助的一些操作符冻辩,今天我們繼續(xù)去學(xué)習(xí)RxJava的一些條件和布爾操作符,在此感謝那些閱讀文章并提出建議的同學(xué)拆祈,其實(shí)寫技術(shù)文章主要是提升自己的知識(shí)面以及對(duì)知識(shí)的理解程度恨闪,也有人說有些地方描述還不夠清晰,文筆有待提高放坏,是的咙咽,確實(shí)是這樣,描述不清晰我感覺不僅是文筆有待提高(提升空間很大)淤年,對(duì)技術(shù)的理解也需要提高(技術(shù)渣蛻變中...)钧敞。不過我相信,只要我能寫出來麸粮,這就是一種進(jìn)步溉苛,就是一個(gè)積累的過程,我會(huì)努力弄诲,加油愚战。好了,不扯了齐遵,進(jìn)入正題凤巨。
All
該操作符是判斷Observable發(fā)射的所有數(shù)據(jù)是否都滿足某一條件,它接收一個(gè)Fun1方法參數(shù)洛搀,此方法接收原始數(shù)據(jù),并返回一個(gè)布爾類型值佑淀,如果原始Observable正常終止并且每一項(xiàng)數(shù)據(jù)都滿足條件留美,就返回true;如果原始Observable的任何一項(xiàng)數(shù)據(jù)不滿足條件就返回False。當(dāng)某數(shù)據(jù)不滿足條件(返回false)時(shí)之后的數(shù)據(jù)不再發(fā)射谎砾。如下示例代碼
Observable.just(1,2,3,4).all(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
Log.e(TAG, "call: "+integer );
return integer<2;
}
}).subscribe(new Subscriber<Boolean>() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted: ");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " );
}
@Override
public void onNext(Boolean aBoolean) {
Log.e(TAG, "onNext: "+aBoolean );
}
});
輸出日志信息
call: 1
call: 2
onNext: false
onCompleted:
Amb
當(dāng)我們傳遞多個(gè)Observable(可接收2到9個(gè)Observable)給amb時(shí)逢倍,它只發(fā)射其中一個(gè)Observable的數(shù)據(jù)和通知:首先發(fā)送通知給amb的那個(gè),不管發(fā)射的是一項(xiàng)數(shù)據(jù)還是一個(gè)onError或onCompleted通知景图。amb將忽略和丟棄其它所有Observables的發(fā)射物较雕。
Observable observable= Observable.just(1,2,3).delay(500,TimeUnit.MILLISECONDS).subscribeOn(Schedulers.newThread());
Observable observable1= Observable.just(4,5,6).delay(100,TimeUnit.MILLISECONDS).subscribeOn(Schedulers.newThread());
Observable.amb(observable,observable1).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted: ");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: ");
}
@Override
public void onNext(Integer integer) {
Log.e(TAG, " onNext: "+integer);
}
});
輸出日志信息
onNext: 4
onNext: 5
onNext: 6
onCompleted:
有一個(gè)類似的對(duì)象方法ambWith。如上示例中Observable.amb(observable,observable1)改為observable.ambWith(observable1)是等價(jià)的挚币。
Contains
我們可以給Contains傳一個(gè)指定的值亮蒋,如果原始Observable發(fā)射了那個(gè)值,它返回的Observable將發(fā)射true妆毕,否則發(fā)射false慎玖,即Observable發(fā)射的數(shù)據(jù)是否包含某一對(duì)象。
示例代碼
Observable.just(1,2,3,4).contains(2)
.subscribe(new Subscriber<Boolean>() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted: " );
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " );
}
@Override
public void onNext(Boolean aBoolean) {
Log.e(TAG, "onNext: "+aBoolean);
}
});
輸出日志信息
onNext: true
onCompleted:
isEmpty也是一種判斷是否包含的操作符笛粘,不同的是它判斷原始Observable是否沒有發(fā)射任何數(shù)據(jù)趁怔。
exists操作符與contains操作符作用相同,但是它接收的是一個(gè)Func1函數(shù)薪前,可以指定一個(gè)判斷條件润努,當(dāng)發(fā)射的數(shù)據(jù)有滿足判斷條件(返回true)就發(fā)射true,否則為false示括。
DefaultIfEmpty
該操作符簡(jiǎn)單的精確地發(fā)射原始Observable的值铺浇,如果原始Observable沒有發(fā)射任何數(shù)據(jù)正常終止(以onCompletedd的形式),DefaultIfEmpty返回的Observable就發(fā)射一個(gè)我們提供的默認(rèn)值例诀。
Observable.empty().defaultIfEmpty(1).subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted: " );
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: ");
}
@Override
public void onNext(Object object) {
Log.e(TAG, "onNext: "+object);
}
});
輸出日志信息
onNext: 1
onCompleted:
defaultIfEmpty只有在沒有發(fā)射數(shù)據(jù)時(shí)才會(huì)有效果随抠,若發(fā)射的有數(shù)據(jù),和不使用此操作符效果一樣繁涂。
SequenceEqual
該操作符會(huì)比較兩個(gè)Observable的發(fā)射物拱她,如果兩個(gè)序列是相同的(相同的數(shù)據(jù),相同的順序扔罪,相同的終止?fàn)顟B(tài))秉沼,它就發(fā)射true,否則發(fā)射false
Observable observable=Observable.just(1,2,3);
Observable observable1=Observable.just(1,3,2);
Observable.sequenceEqual(observable,observable1)
.subscribe(new Subscriber<Boolean>() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted: " );
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " );
}
@Override
public void onNext(Boolean aBoolean) {
Log.e(TAG, "onNext: " +aBoolean);
}
});
執(zhí)行后輸出
onNext: false
onCompleted:
SkipUntil
SkipUntil訂閱原始的Observable矿酵,但是忽略它的發(fā)射物唬复,直到第二個(gè)Observable發(fā)射了一項(xiàng)數(shù)據(jù)那一刻,它開始發(fā)射原始Observable全肮。
Observable observable = Observable.just(1, 2, 3,4,5,6).delay(100, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.newThread());
Observable observable1 = Observable.just(20, 21, 22).delay(130, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.newThread());
observable.skipUntil(observable1)
.subscribe(new Subscriber() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted: " );
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " );
}
@Override
public void onNext(Object o) {
Log.e(TAG, "onNext: "+o );
}
});
輸出日志信息
onNext: 4
onNext: 5
onNext: 6
onCompleted:
由于上面兩個(gè)Observable都是在一個(gè)新線程中敞咧,時(shí)間不可控,每次運(yùn)行的結(jié)果一般不會(huì)相同辜腺。但是都會(huì)符合上面所述規(guī)則休建,可參考上圖乍恐。
SkipWhile
該操作符也是忽略它的發(fā)射物,直到我們指定的某個(gè)條件變?yōu)閒alse的那一刻测砂,它開始發(fā)射原始Observable茵烈。切記是判斷條件返回false時(shí)開始發(fā)射數(shù)據(jù)。
示例代碼
Observable.range(1,5).skipWhile(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
Log.e(TAG, "call: "+integer);
return integer<3;
}
}).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted: " );
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " );
}
@Override
public void onNext(Integer integer) {
Log.e(TAG, "onNext: " +integer);
}
});
輸出日志信息
call: 1
call: 2
call: 3
onNext: 3
onNext: 4
onNext: 5
onCompleted:
TakeUntil
如果我們理解了SkipUntil操作符了砌些,那么這個(gè)操作符也就很好理解了呜投,該操作符與SkipUntil有點(diǎn)相反的意思。通過上圖你應(yīng)該也看出來和SkipUntil的區(qū)別存璃,當(dāng)?shù)诙€(gè)Observable發(fā)射了一項(xiàng)數(shù)據(jù)或者終止時(shí)仑荐,丟棄原始Observable發(fā)射的任何數(shù)據(jù)(SkipUntil則是丟棄之前數(shù)據(jù),發(fā)射之后的數(shù)據(jù))有巧。
Observable observable = Observable.just(1, 2, 3,4,5,6).delay(100, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.newThread());
Observable observable1 = Observable.just(20, 21, 22).delay(120, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.newThread());
observable.takeUntil(observable1)
.subscribe(new Subscriber() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted: " );
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " );
}
@Override
public void onNext(Object o) {
Log.e(TAG, "onNext: "+o );
}
});
輸出日志信息(每次執(zhí)行的輸出結(jié)果一般不相同)
onNext: 1
onNext: 2
onNext: 3
onNext: 4
onCompleted:
TakeWhile
該操作符發(fā)射原始Observable释漆,直到我們指定的某個(gè)條件不成立的那一刻,它停止發(fā)射原始Observable(skipWhile此時(shí)開始發(fā)射)篮迎,并終止自己的Observable男图。
Observable.range(1,5).takeWhile(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
Log.e(TAG, "call: "+integer);
return integer<3;
}
}).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted: " );
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " );
}
@Override
public void onNext(Integer integer) {
Log.e(TAG, "onNext: " +integer);
}
});
輸出日志信息
call: 1
onNext: 1
call: 2
onNext: 2
call: 3
onCompleted:
今天的這篇文章到這里就結(jié)束了,若文中有錯(cuò)誤的地方甜橱,歡迎指正逊笆。謝謝。