RxJava操作符系列六

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: 

今天的這篇文章到這裏就結束了,若文中有錯誤的地方,歡迎指正。謝謝。

發佈了47 篇原創文章 · 獲贊 42 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章