簡要:
需求了解:
在 Rxjava 的眾多操作符中膀估,有數(shù)據(jù)變換观话、過濾等炒嘲,但是有的時(shí)候是不是有一些判斷的操作呢蹬铺?比如判斷一個(gè) Observable 的所有數(shù)據(jù)是否滿足一個(gè)指定的條件尝哆,判斷某個(gè) Observable 是否會(huì)發(fā)射一個(gè)指定的值等等的判斷操作,答案是肯定的甜攀,Rxjava 中提供了一系列的布爾條件判斷操作符秋泄。
Rxjava
中的布爾操作符主要包括:
-
All
:判斷是否所有的數(shù)據(jù)項(xiàng)都滿足某個(gè)條件。 -
Contains
:判斷 Observable 是否會(huì)發(fā)射一個(gè)指定的值规阀。 -
IsEmpty
:判斷原始Observable是否未發(fā)射任何數(shù)據(jù)恒序。 -
SequenceEqual
:判斷兩個(gè) Observables 發(fā)射的序列是否相等。
1. All
判斷是否所有的數(shù)據(jù)項(xiàng)都滿足某個(gè)條件谁撼。
解析: 傳遞一個(gè)謂詞函數(shù)(predicate
)給 All
操作符歧胁,這個(gè)函數(shù)接受原始 Observable 發(fā)射的數(shù)據(jù),根據(jù)計(jì)算返回一個(gè)布爾值彤敛。 All 返回一個(gè)只發(fā)射一個(gè)單個(gè)布爾值的 Observable与帆,如果原始 Observable 正常終止并且每一項(xiàng)數(shù)據(jù)都滿足條件,就返回 true
墨榄;如果原始 Observable 的任何一項(xiàng)數(shù)據(jù)不滿足條件就返回 false
玄糟。
示例代碼:
/**
* all(Predicate predicate)
* 通過傳入的謂語函數(shù)predicate進(jìn)行判斷所有數(shù)據(jù)項(xiàng)是否滿足條件,然后返回一個(gè)判斷結(jié)果發(fā)射給觀察者
*/
Observable.just(1, 2, 3, 4, 5)
.all(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) throws Exception {
return integer > 5; // 判斷原始數(shù)據(jù)項(xiàng)中的所有數(shù)據(jù)項(xiàng)是否大于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 是否會(huì)發(fā)射一個(gè)指定的值袄秩。
解析: 給 Contains
傳一個(gè)指定的值阵翎,如果原始 Observable 發(fā)射了那個(gè)值,它返回的 Observable 將發(fā)射 true
之剧,否則發(fā)射 false
郭卫。
示例代碼:
/**
* contains(Object element)
* 判斷原始Observable是否發(fā)射了指定的element數(shù)據(jù)
*/
Observable.just(1, 2, 3, 4, 5)
.contains(5) // 判斷原始數(shù)據(jù)項(xiàng)中是否有數(shù)據(jù)項(xiàng)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是否未發(fā)射任何數(shù)據(jù)。
解析: 判斷原始 Observable 是否發(fā)射了數(shù)據(jù)項(xiàng)背稼,如果原始 Observable 發(fā)射了數(shù)據(jù)贰军,將發(fā)射 false
,否則發(fā)射 true
蟹肘。
示例代碼:
/**
* isEmpty()
* 判斷原始Observable是否發(fā)射了數(shù)據(jù)項(xiàng)词疼,如果原始Observable發(fā)射了數(shù)據(jù),將發(fā)射false帘腹,否則發(fā)射true贰盗。
*/
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onComplete(); // 不發(fā)射任何數(shù)據(jù),直接發(fā)射完成通知
}
}).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
判斷兩個(gè) Observables 發(fā)射的序列是否相等阳欲。
解析: 傳遞兩個(gè) Observable 給 SequenceEqual
操作符舵盈,它會(huì)比較兩個(gè) Observable 的發(fā)射物陋率,如果兩個(gè)序列是相同的(相同的數(shù)據(jù),相同的順序秽晚,相同的終止?fàn)顟B(tài))瓦糟,它就發(fā)射 true
,否則發(fā)射 false
爆惧。還可以可以傳遞一個(gè)函數(shù)用于比較兩個(gè)數(shù)據(jù)項(xiàng)是否相同或者設(shè)置一個(gè)緩存大小指定第一個(gè)和第二個(gè)源 ObservableSource
預(yù)取的項(xiàng)數(shù)狸页。
示例代碼:
// 創(chuàng)建Observable
Observable<Integer> observable1 = Observable.range(1, 10);
Observable<Integer> observable2 = Observable.range(1, 10);
/**
* 1. sequenceEqual(ObservableSource source1, ObservableSource source2)
* 比較兩個(gè)Observable的數(shù)據(jù)項(xiàng)是否完全相同(相同數(shù)據(jù),順序扯再,相同終止?fàn)顟B(tài)),相同則發(fā)射true址遇,否則發(fā)射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: // 可選參數(shù)熄阻,定義兩個(gè)Observable的數(shù)據(jù)項(xiàng)比較規(guī)則
* bufferSize: // 從第一個(gè)和第二個(gè)源ObservableSource預(yù)取的項(xiàng)數(shù)
* 通過指定的比較函數(shù)isEqual比較兩個(gè)Observable的數(shù)據(jù)項(xiàng)是否完全相同(相同數(shù)據(jù),順序倔约,相同終止?fàn)顟B(tài))秃殉,
* 相同則發(fā)射true,否則發(fā)射false浸剩。還可以通過bufferSize指定一個(gè)緩存大小钾军。
*/
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; // 比較兩個(gè)Observable的數(shù)據(jù)序列數(shù)據(jù)是否相等
}
}, 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)
小結(jié)
本節(jié)主要介紹了Rxjava
布爾(判斷)操作符可以根據(jù)不同的條件返回 boolean
類型的值,對(duì) Observable 進(jìn)行不同的判斷绢要。
提示:以上使用的Rxjava2版本: 2.2.12
Rx介紹與講解及完整目錄參考:Rxjava2 介紹與詳解實(shí)例
實(shí)例代碼: