RxJava操作符(08-條件和布爾操作)

轉載請標明出處:
http://blog.csdn.net/xmxkf/article/details/51671826
本文出自:【openXu的博客】

目錄:

1. All

  判定是否Observable發射的所有數據都滿足某個條件。 傳遞一個謂詞函數給All操作符,這個函數接受原始Observable發射的數據,根據計算返回一個布爾值。All返回一個只發射一個單個布爾值的Observable,如果原始Observable正常終止並且每一項數據都滿足條件,就返回true;如果原始Observable的任何一項數據不滿足條件就返回False。

    這裏寫圖片描述

示例代碼:

Observable.just(1,2,3,4)
        .all(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                Log.v(TAG, ""+integer);
                return integer<3;    //判斷是不是發射的所有數據都小於3
            }
        }).subscribe(new Subscriber<Boolean>() {
    @Override
    public void onCompleted() {
        Log.v(TAG, "onCompleted");
    }
    @Override
    public void onError(Throwable e) {
        Log.v(TAG, "onError:"+e.getMessage());
    }
    @Override
    public void onNext(Boolean aBoolean) {
        Log.v(TAG, "onNext:"+aBoolean);
    }
});

輸出:

1
2
3
onNext:false
onCompleted

2. Amb

  傳遞兩個或多個Observable給Amb時,它只發射其中首先發射數據或通知(onError或onCompleted)的那個Observable的所有數據,而其他所有的Observable的發射物將被丟棄。
  有一個類似的對象方法ambWith。Observable.amb(o1,o2)和o1.ambWith(o2)是等價的。

    這裏寫圖片描述

示例代碼:

Observable.amb(
        //第一個Observable延遲1秒發射數據
        Observable.just(1,2,3).delay(1,TimeUnit.SECONDS),
        Observable.just(4,5,6))
        .subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                Log.v(TAG, "onCompleted");
            }
            @Override
            public void onError(Throwable e) {
                Log.v(TAG, "onError:"+e.getMessage());
            }
            @Override
            public void onNext(Integer integer) {
                Log.v(TAG, "onNext:"+integer);
            }
});

輸出:

onNext:4
onNext:5
onNext:6
onCompleted

3. Contains

Contains:判斷一個Observable發射的所有數據中,是否包含一個特定的值。給Contains傳一個特定的值,如果原始Observable發射了那個值, 它返回的Observable將發射true,否則發射false。

    這裏寫圖片描述

IsEmpty:相關的一個操作符IsEmpty用於判定原始Observable是否沒有發射任何數據。

    這裏寫圖片描述

exists:RxJava中還有一個exists操作符,它通過一個謂詞函數測試原始Observable發射的數據,只要任何一項滿足條件就返回一個發射true的Observable,否則返回一個發射false的Observable。
    這裏寫圖片描述

示例代碼:

//Contains:判定一個Observable是否發射一個特定的值
Observable.just(4,5,6)
        .contains(4)
        .subscribe(new Action1<Boolean>() {
            @Override
            public void call(Boolean aBoolean) {
                Log.v(TAG, "contains(4):"+aBoolean);
            }
        });
//isEmpty:判定原始Observable是否沒有發射任何數據
Observable.just(4,5,6)
        .isEmpty()
        .subscribe(aBoolean->Log.v(TAG, "isEmpty():"+aBoolean));
//exists操作符,它通過一個謂詞函數測試原始Observable發射的數據,
// 只要任何一項滿足條件就返回一個發射true的Observable,
// 否則返回一個發射false的Observable。
Observable.just(4,5,6)
        .exists(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                return integer<5;
            }
        })
        .subscribe(aBoolean->Log.v(TAG, "exists():"+aBoolean));

輸出:

contains(4):true
isEmpty():false
exists():true

4. DefaultIfEmpty

  DefaultIfEmpty簡單的精確地發射原始Observable的值,如果原始Observable沒有發射任何數據正常終止(以onCompletedd的形式),DefaultIfEmpty返回的Observable就發射一個你提供的默認值。

    這裏寫圖片描述

示例代碼:

Observable.empty()
        .defaultIfEmpty(10)
        .subscribe(integer->Log.v(TAG, "defaultIfEmpty():"+integer));

輸出:

defaultIfEmpty():10

5. SequenceEqual

  判定兩個Observables是否發射相同的數據序列。 傳遞兩個Observable給SequenceEqual操作符,它會比較兩個Observable的發射物,如果兩個序列是相同的(相同的數據,相同的順序,相同的終止狀態),它就發射true,否則發射false。

    這裏寫圖片描述

示例代碼:

Observable.sequenceEqual(
        //第一個Observable延遲1秒發射數據
        Observable.just(4,5,6).delay(1,TimeUnit.SECONDS),
        Observable.just(4,5,6))
        .subscribe(aBoolean -> Log.v(TAG, "sequenceEqual:"+aBoolean));

輸出:

sequenceEqual:true

6. SkipUntil

  SkipUntil訂閱原始的Observable,但是忽略它的發射物,直到第二個Observable發射了一項數據那一刻,它開始發射原始Observable。

    這裏寫圖片描述

示例代碼:

Observable.interval(1, TimeUnit.SECONDS)
        .take(6)
        .skipUntil(Observable.just(10).delay(3,TimeUnit.SECONDS))
        .subscribe(aBoolean -> Log.v(TAG, "skipUntil:"+aBoolean));

輸出:

skipUntil:3
skipUntil:4
skipUntil:5

7. SkipWhile

  SkipWhile訂閱原始的Observable,但是忽略它的發射物,直到你指定的某個條件變爲false的那一刻,它開始發射原始Observable。

    這裏寫圖片描述

示例代碼:

Observable.interval(1, TimeUnit.SECONDS)
        .take(6)
        .skipWhile(new Func1<Long, Boolean>() {
            @Override
            public Boolean call(Long aLong) {
                return aLong<3;   //捨棄原Observable發射的數據,直到發射的數據>=3,才繼續發射
            }
        })
        .subscribe(aBoolean -> Log.v(TAG, "SkipWhile:"+aBoolean));

輸出:

SkipWhile:3
SkipWhile:4
SkipWhile:5

8. TakeUntil

  TakeUntil訂閱並開始發射原始Observable,它還監視你提供的第二個Observable。如果第二個Observable發射了一項數據或者發射了一個終止通知( onError通知或一個onCompleted通知),TakeUntil返回的Observable會停止發射原始Observable並終止。

    這裏寫圖片描述

示例代碼:

//3s後takeUntil的參數Observable發射數據,停止原始Observable
Observable.interval(1, TimeUnit.SECONDS)
        .takeUntil(Observable.timer(3, TimeUnit.SECONDS))
        .subscribe(aBoolean -> Log.v(TAG, "TakeUntil:"+aBoolean));

輸出:

TakeUntil:0
TakeUntil:1

9. TakeWhile

  TakeWhile發射原始Observable,直到你指定的某個條件不成立的那一刻,它停止發射原始Observable,並終止自己的Observable。

    這裏寫圖片描述

示例代碼:

Observable.interval(1, TimeUnit.SECONDS)
        .takeWhile(new Func1<Long, Boolean>() {
            @Override
            public Boolean call(Long aLong) {
                return aLong<3;
            }
        })
        .subscribe(aBoolean -> Log.v(TAG, "TakeWhile:"+aBoolean));

輸出:

TakeWhile:0
TakeWhile:1
TakeWhile:2

源碼下載:

https://github.com/openXu/RxJavaTest

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章