簡要:
需求了解:
在 Rxjava 的眾多操作符中,有數據變換、過濾等,但是有的時候是不是有一些判斷的操作呢?比如判斷一個 Observable 的所有數據是否滿足一個指定的條件,判斷某個 Observable 是否會發射一個指定的值等等的判斷操作,答案是肯定的,Rxjava 中提供了一系列的布爾條件判斷操作符。
Rxjava
中的布爾操作符主要包括:
-
All
:判斷是否所有的數據項都滿足某個條件。 -
Contains
:判斷 Observable 是否會發射一個指定的值。 -
IsEmpty
:判斷原始Observable是否未發射任何數據。 -
SequenceEqual
:判斷兩個 Observables 發射的序列是否相等。
1. All
判斷是否所有的數據項都滿足某個條件。
解析: 傳遞一個謂詞函數(predicate
)給 All
操作符,這個函數接受原始 Observable 發射的數據,根據計算返回一個布爾值。 All 返回一個只發射一個單個布爾值的 Observable,如果原始 Observable 正常終止并且每一項數據都滿足條件,就返回 true
;如果原始 Observable 的任何一項數據不滿足條件就返回 false
。
示例代碼:
/**
* all(Predicate predicate)
* 通過傳入的謂語函數predicate進行判斷所有數據項是否滿足條件,然后返回一個判斷結果發射給觀察者
*/
Observable.just(1, 2, 3, 4, 5)
.all(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) throws Exception {
return integer > 5; // 判斷原始數據項中的所有數據項是否大于5
}
})
.subscribe(new SingleObserver<Boolean>() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("--> onSubscribe");
}
@Override
public void onSuccess(Boolean aBoolean) {
System.out.println("--> onSuccess: " + aBoolean);
}
@Override
public void onError(Throwable e) {
System.out.println("--> onError: " + e);
}
});
輸出:
--> onSubscribe
--> onSuccess: false
Javadoc: all(Predicate predicate)
2. Contains
判斷 Observable 是否會發射一個指定的值。
解析: 給 Contains
傳一個指定的值,如果原始 Observable 發射了那個值,它返回的 Observable 將發射 true
,否則發射 false
。
示例代碼:
/**
* contains(Object element)
* 判斷原始Observable是否發射了指定的element數據
*/
Observable.just(1, 2, 3, 4, 5)
.contains(5) // 判斷原始數據項中是否有數據項5
.subscribe(new SingleObserver<Boolean>() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("--> onSubscribe");
}
@Override
public void onSuccess(Boolean aBoolean) {
System.out.println("--> onSuccess: " + aBoolean);
}
@Override
public void onError(Throwable e) {
System.out.println("--> onError: " + e);
}
});
輸出:
--> onSubscribe
--> onSuccess: true
Javadoc: contains(Object element)
3. IsEmpty
判斷原始Observable是否未發射任何數據。
解析: 判斷原始 Observable 是否發射了數據項,如果原始 Observable 發射了數據,將發射 false
,否則發射 true
。
示例代碼:
/**
* isEmpty()
* 判斷原始Observable是否發射了數據項,如果原始Observable發射了數據,將發射false,否則發射true。
*/
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onComplete(); // 不發射任何數據,直接發射完成通知
}
}).isEmpty()
.subscribe(new SingleObserver<Boolean>() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("--> onSubscribe");
}
@Override
public void onSuccess(Boolean aBoolean) {
System.out.println("--> onSuccess: " + aBoolean);
}
@Override
public void onError(Throwable e) {
System.out.println("--> onError: " + e);
}
});
輸出:
--> onSubscribe
--> onSuccess: true
Javadoc: isEmpty()
4. SequenceEqual
判斷兩個 Observables 發射的序列是否相等。
解析: 傳遞兩個 Observable 給 SequenceEqual
操作符,它會比較兩個 Observable 的發射物,如果兩個序列是相同的(相同的數據,相同的順序,相同的終止狀態),它就發射 true
,否則發射 false
。還可以可以傳遞一個函數用于比較兩個數據項是否相同或者設置一個緩存大小指定第一個和第二個源 ObservableSource
預取的項數。
示例代碼:
// 創建Observable
Observable<Integer> observable1 = Observable.range(1, 10);
Observable<Integer> observable2 = Observable.range(1, 10);
/**
* 1. sequenceEqual(ObservableSource source1, ObservableSource source2)
* 比較兩個Observable的數據項是否完全相同(相同數據,順序,相同終止狀態),相同則發射true,否則發射false
*/
Observable.sequenceEqual(observable1, observable2)
.subscribe(new SingleObserver<Boolean>() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("--> onSubscribe(1)");
}
@Override
public void onSuccess(Boolean aBoolean) {
System.out.println("--> onSuccess(1): " + aBoolean);
}
@Override
public void onError(Throwable e) {
System.out.println("--> onError(1): " + e);
}
});
System.out.println("----------------------------------------");
/**
* 2. sequenceEqual(ObservableSource source1, ObservableSource source2, BiPredicate isEqual, int bufferSize)
* isEqual: // 可選參數,定義兩個Observable的數據項比較規則
* bufferSize: // 從第一個和第二個源ObservableSource預取的項數
* 通過指定的比較函數isEqual比較兩個Observable的數據項是否完全相同(相同數據,順序,相同終止狀態),
* 相同則發射true,否則發射false。還可以通過bufferSize指定一個緩存大小。
*/
Observable.sequenceEqual(observable1, observable2, new BiPredicate<Integer, Integer>() {
@Override
public boolean test(Integer t1, Integer t2) throws Exception {
System.out.println("--> test(2): t1 = " + t1 + ", t2 = " + t2);
return t1 == t2; // 比較兩個Observable的數據序列數據是否相等
}
}, 3).subscribe(new SingleObserver<Boolean>() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("--> onSubscribe(2)");
}
@Override
public void onSuccess(Boolean aBoolean) {
System.out.println("--> onSuccess(2): " + aBoolean);
}
@Override
public void onError(Throwable e) {
System.out.println("--> onError(2): " + e);
}
});
輸出:
--> onSubscribe(1)
--> onSuccess(1): true
----------------------------------------
--> onSubscribe(2)
--> test(2): t1 = 1, t2 = 1
--> test(2): t1 = 2, t2 = 2
--> test(2): t1 = 3, t2 = 3
--> test(2): t1 = 4, t2 = 4
--> test(2): t1 = 5, t2 = 5
--> test(2): t1 = 6, t2 = 6
--> test(2): t1 = 7, t2 = 7
--> test(2): t1 = 8, t2 = 8
--> test(2): t1 = 9, t2 = 9
--> test(2): t1 = 10, t2 = 10
--> onSuccess(2): true
Javadoc: sequenceEqual(ObservableSource source1, ObservableSource source2)
Javadoc: sequenceEqual(ObservableSource source1, ObservableSource source2, BiPredicate isEqual)
Javadoc: sequenceEqual(ObservableSource source1, ObservableSource source2, int bufferSize)
Javadoc: sequenceEqual(ObservableSource source1, ObservableSource source2, BiPredicate isEqual, int bufferSize)
小結
本節主要介紹了Rxjava
布爾(判斷)操作符可以根據不同的條件返回 boolean
類型的值,對 Observable 進行不同的判斷。
提示:以上使用的Rxjava2版本: 2.2.12
Rx介紹與講解及完整目錄參考:Rxjava2 介紹與詳解實例
實例代碼: