RxJava操作符系列傳送門
RxJava操作符源碼
RxJava操作符系列一
RxJava操作符系列二
RxJava操作符系列三
RxJava操作符系列四
RxJava操作符系列五
前言
在上幾篇文章我們介紹了一些RxJava創建,轉換,過濾,組合,輔助的一些操作符,今天我們繼續去學習RxJava的一些條件和布爾操作符,在此感謝那些閱讀文章並提出建議的同學,其實寫技術文章主要是提升自己的知識面以及對知識的理解程度,也有人說有些地方描述還不夠清晰,文筆有待提高,是的,確實是這樣,描述不清晰我感覺不僅是文筆有待提高(提升空間很大),對技術的理解也需要提高(技術渣蛻變中…)。不過我相信,只要我能寫出來,這就是一種進步,就是一個積累的過程,我會努力,加油。好了,不扯了,進入正題。
All
該操作符是判斷Observable發射的所有數據是否都滿足某一條件,它接收一個Fun1方法參數,此方法接收原始數據,並返回一個布爾類型值,如果原始Observable正常終止並且每一項數據都滿足條件,就返回true;如果原始Observable的任何一項數據不滿足條件就返回False。當某數據不滿足條件(返回false)時之後的數據不再發射。如下示例代碼
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
當我們傳遞多個Observable(可接收2到9個Observable)給amb時,它只發射其中一個Observable的數據和通知:首先發送通知給amb的那個,不管發射的是一項數據還是一個onError或onCompleted通知。amb將忽略和丟棄其它所有Observables的發射物。
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:
有一個類似的對象方法ambWith。如上示例中Observable.amb(observable,observable1)改爲observable.ambWith(observable1)是等價的。
Contains
我們可以給Contains傳一個指定的值,如果原始Observable發射了那個值,它返回的Observable將發射true,否則發射false,即Observable發射的數據是否包含某一對象。
示例代碼
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是否沒有發射任何數據。
exists操作符與contains操作符作用相同,但是它接收的是一個Func1函數,可以指定一個判斷條件,當發射的數據有滿足判斷條件(返回true)就發射true,否則爲false。
DefaultIfEmpty
該操作符簡單的精確地發射原始Observable的值,如果原始Observable沒有發射任何數據正常終止(以onCompletedd的形式),DefaultIfEmpty返回的Observable就發射一個我們提供的默認值。
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只有在沒有發射數據時纔會有效果,若發射的有數據,和不使用此操作符效果一樣。
SequenceEqual
該操作符會比較兩個Observable的發射物,如果兩個序列是相同的(相同的數據,相同的順序,相同的終止狀態),它就發射true,否則發射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);
}
});
執行後輸出
onNext: false
onCompleted:
SkipUntil
SkipUntil訂閱原始的Observable,但是忽略它的發射物,直到第二個Observable發射了一項數據那一刻,它開始發射原始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:
由於上面兩個Observable都是在一個新線程中,時間不可控,每次運行的結果一般不會相同。但是都會符合上面所述規則,可參考上圖。
SkipWhile
該操作符也是忽略它的發射物,直到我們指定的某個條件變爲false的那一刻,它開始發射原始Observable。切記是判斷條件返回false時開始發射數據。
示例代碼
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操作符了,那麼這個操作符也就很好理解了,該操作符與SkipUntil有點相反的意思。
通過上圖你應該也看出來和SkipUntil的區別,當第二個Observable發射了一項數據或者終止時,丟棄原始Observable發射的任何數據(SkipUntil則是丟棄之前數據,發射之後的數據)。
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 );
}
});
輸出日誌信息(每次執行的輸出結果一般不相同)
onNext: 1
onNext: 2
onNext: 3
onNext: 4
onCompleted:
TakeWhile
該操作符發射原始Observable,直到我們指定的某個條件不成立的那一刻,它停止發射原始Observable(skipWhile此時開始發射),並終止自己的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:
今天的這篇文章到這裏就結束了,若文中有錯誤的地方,歡迎指正。謝謝。