Carson帶你學Android:RxJava條件/布爾操作符

前言

  • Rxjava,由于其基于事件流的鏈式調(diào)用、邏輯簡潔 & 使用簡單的特點,深受各大 Android開發(fā)者的歡迎。

如果還不了解 RxJava,請看文章:Android:這是一篇 清晰 & 易懂的Rxjava 入門教程

  • RxJava如此受歡迎的原因,在于其提供了豐富 & 功能強大的操作符,幾乎能完成所有的功能需求
  • 今天,我將為大家詳細介紹RxJava操作符中最常用的 條件 / 布爾操作符,希望你們會喜歡。

Carson帶你學RxJava系列文章,包括 原理、操作符、應用場景、背壓等等,請關注看文章:Android:這是一份全面 & 詳細的RxJava學習指南


目錄

目錄

1. 作用

通過設置函數(shù),判斷被觀察者(Observable)發(fā)送的事件是否符合條件


2. 類型

RxJava2中,條件 / 布爾操作符的類型包括:

示意圖

下面,我將對每個操作符進行詳細講解

3. 具體操作符詳解

注:在使用RxJava 2操作符前,記得在項目的Gradle中添加依賴:

dependencies {
      compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
      compile 'io.reactivex.rxjava2:rxjava:2.0.7'
      // 注:RxJava2 與 RxJava1 不能共存,即依賴不能同時存在
}

3.1 all()

作用:判斷發(fā)送的每項數(shù)據(jù)是否都滿足 設置的函數(shù)條件

若滿足,返回 true;否則,返回 false

  • 具體代碼

  Observable.just(1,2,3,4,5,6)
                .all(new Predicate<Integer>(){
                    @Override
                    public boolean test( Integer integer) throws Exception {
                        return (integer<=10);
                        // 該函數(shù)用于判斷Observable發(fā)送的10個數(shù)據(jù)是否都滿足integer<=10
                    }
                }).subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                Log.d(TAG,"result is "+ aBoolean);
                // 輸出返回結果
            }

        });


  • 測試結果:因為所有數(shù)據(jù)都滿足函數(shù)內(nèi)條件 (每項數(shù)據(jù)<=10)


    示意圖

3.2 takeWhile()

作用:判斷發(fā)送的每項數(shù)據(jù)是否滿足 設置函數(shù)條件

若發(fā)送的數(shù)據(jù)滿足該條件,則發(fā)送該項數(shù)據(jù);否則不發(fā)送

  • 具體代碼
// 1. 每1s發(fā)送1個數(shù)據(jù) = 從0開始,遞增1,即0、1、2、3
        Observable.interval(1, TimeUnit.SECONDS)
                // 2. 通過takeWhile傳入一個判斷條件
                .takeWhile(new Predicate<Long>(){
                    @Override
                    public boolean test( Long integer) throws Exception {
                        return (integer<3);
                        // 當發(fā)送的數(shù)據(jù)滿足<3時,才發(fā)送Observable的數(shù)據(jù)
                    }
                }).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
            }

            @Override
            public void onNext(Long value) {
                Log.d(TAG,"發(fā)送了事件 "+ value);
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onComplete() {
            }
        });
  • 測試結果
示意圖

3.3 skipWhile()

作用:判斷發(fā)送的每項數(shù)據(jù)是否滿足 設置函數(shù)條件

直到該判斷條件 = false時,才開始發(fā)送Observable的數(shù)據(jù)

  • 具體使用
// 1. 每隔1s發(fā)送1個數(shù)據(jù) = 從0開始,每次遞增1
        Observable.interval(1, TimeUnit.SECONDS)
                // 2. 通過skipWhile()設置判斷條件
                .skipWhile(new Predicate<Long>(){
                    @Override
                    public boolean test( Long aLong) throws Exception {
                        return (aLong<5);
                        // 直到判斷條件不成立 = false = 發(fā)射的數(shù)據(jù)≥5,才開始發(fā)送數(shù)據(jù)
                    }
                }).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
            }

            @Override
            public void onNext(Long value) {
                Log.d(TAG,"發(fā)送了事件 "+ value);
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onComplete() {
            }
        });
  • 測試結果
示意圖

3.4 takeUntil()

作用:執(zhí)行到某個條件時,停止發(fā)送事件。具體使用如下:

// 1. 每1s發(fā)送1個數(shù)據(jù) = 從0開始,遞增1,即0、1、2、3
        Observable.interval(1, TimeUnit.SECONDS)
                // 2. 通過takeUntil的Predicate傳入判斷條件
                .takeUntil(new Predicate<Long>(){
                    @Override
                    public boolean test( Long integer) throws Exception {
                        return (integer>3);
                        // 返回true時,就停止發(fā)送事件
                        // 當發(fā)送的數(shù)據(jù)滿足>3時,就停止發(fā)送Observable的數(shù)據(jù)
                    }
                }).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
            }

            @Override
            public void onNext(Long value) {
                Log.d(TAG,"發(fā)送了事件 "+ value);
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onComplete() {
            }
        });

  • 測試結果
示意圖

該判斷條件也可以是Observable,即 等到 takeUntil() 傳入的Observable開始發(fā)送數(shù)據(jù),(原始)第1個Observable的數(shù)據(jù)停止發(fā)送數(shù)據(jù)

// (原始)第1個Observable:每隔1s發(fā)送1個數(shù)據(jù) = 從0開始,每次遞增1
        Observable.interval(1, TimeUnit.SECONDS)
                // 第2個Observable:延遲5s后開始發(fā)送1個Long型數(shù)據(jù)
                .takeUntil(Observable.timer(5, TimeUnit.SECONDS))
                .subscribe(new Observer<Long>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "開始采用subscribe連接");
                    }

                    @Override
                    public void onNext(Long value) {
                        Log.d(TAG, "接收到了事件"+ value  );
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "對Error事件作出響應");
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "對Complete事件作出響應");
                    }

                });
  • 測試結果

當?shù)?5s 時,第2個 Observable 開始發(fā)送數(shù)據(jù),于是(原始)第1個 Observable 停止發(fā)送數(shù)據(jù)

示意圖

3.5 skipUntil()

  • 作用:等到 skipUntil() 傳入的Observable開始發(fā)送數(shù)據(jù),(原始)第1個Observable的數(shù)據(jù)才開始發(fā)送數(shù)據(jù)

  • 具體使用

                // (原始)第1個Observable:每隔1s發(fā)送1個數(shù)據(jù) = 從0開始,每次遞增1
        Observable.interval(1, TimeUnit.SECONDS)
                // 第2個Observable:延遲5s后開始發(fā)送1個Long型數(shù)據(jù)
                .skipUntil(Observable.timer(5, TimeUnit.SECONDS))
                .subscribe(new Observer<Long>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "開始采用subscribe連接");
                    }

                    @Override
                    public void onNext(Long value) {
                        Log.d(TAG, "接收到了事件"+ value  );
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "對Error事件作出響應");
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "對Complete事件作出響應");
                    }

                });
  • 測試結果:5s后( skipUntil() 傳入的Observable開始發(fā)送數(shù)據(jù)),(原始)第1個Observable的數(shù)據(jù)才開始發(fā)送
示意圖

3.6 SequenceEqual()

  • 作用:判定兩個Observables需要發(fā)送的數(shù)據(jù)是否相同

若相同,返回 true;否則,返回 false

  • 具體使用
Observable.sequenceEqual(
                Observable.just(4,5,6),
                Observable.just(4,5,6)
        )
                .subscribe(new Consumer<Boolean>() {
                    @Override
                    public void accept( Boolean aBoolean) throws Exception {
                        Log.d(TAG,"2個Observable是否相同:"+ aBoolean);
                        // 輸出返回結果
                    }
                });
  • 測試結果
示意圖

3.7 contains()

  • 作用:判斷發(fā)送的數(shù)據(jù)中是否包含指定數(shù)據(jù)
  1. 若包含,返回 true;否則,返回 false
  2. 內(nèi)部實現(xiàn) = exists()
  • 具體代碼
Observable.just(1,2,3,4,5,6)
                .contains(4)
                .subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                Log.d(TAG,"result is "+ aBoolean);
                // 輸出返回結果
            }

        });
  • 測試結果:因為發(fā)送的數(shù)據(jù)中包含4


    示意圖

3.8 isEmpty()

  • 作用:判斷發(fā)送的數(shù)據(jù)是否為空

若為空,返回 true;否則,返回 false

  • 具體代碼
Observable.just(1,2,3,4,5,6)
          .isEmpty() // 判斷發(fā)送的數(shù)據(jù)中是否為空
        }).subscribe(new Action1<Boolean>() {
            @Override
            public void call(Boolean aBoolean) {
                Log.d(TAG,"result is "+ aBoolean); 
                // 輸出返回結果
            }
        });
  • 測試結果:因為發(fā)送的數(shù)據(jù)不為空


    示意圖

3.9 amb()

  • 作用:當需要發(fā)送多個 Observable時,只發(fā)送 先發(fā)送數(shù)據(jù)的Observable的數(shù)據(jù),而其余 Observable則被丟棄。

  • 具體代碼

       // 設置2個需要發(fā)送的Observable & 放入到集合中
        List<ObservableSource<Integer>> list= new ArrayList <>();
        // 第1個Observable延遲1秒發(fā)射數(shù)據(jù)
        list.add( Observable.just(1,2,3).delay(1,TimeUnit.SECONDS));
        // 第2個Observable正常發(fā)送數(shù)據(jù)
        list.add( Observable.just(4,5,6));

        // 一共需要發(fā)送2個Observable的數(shù)據(jù)
        // 但由于使用了amba(),所以僅發(fā)送先發(fā)送數(shù)據(jù)的Observable
        // 即第二個(因為第1個延時了)
        Observable.amb(list).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e(TAG, "接收到了事件 "+integer);
            }
        });
  • 測試結果:即只發(fā)送了先發(fā)送數(shù)據(jù)的Observable的數(shù)據(jù) = 4,5,6


    示意圖

3.10 defaultIfEmpty()

  • 作用:在不發(fā)送任何有效事件( Next事件)、僅發(fā)送了 Complete 事件的前提下,發(fā)送一個默認值

  • 具體使用

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                // 不發(fā)送任何有效事件
                //  e.onNext(1);
                //  e.onNext(2);

                // 僅發(fā)送Complete事件
                e.onComplete();
            }
        }).defaultIfEmpty(10) // 若僅發(fā)送了Complete事件,默認發(fā)送 值 = 10
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "開始采用subscribe連接");
                    }

                    @Override
                    public void onNext(Integer value) {
                        Log.d(TAG, "接收到了事件"+ value  );
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "對Error事件作出響應");
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "對Complete事件作出響應");
                    }
                });
  • 測試結果
示意圖

至此,RxJava2中常用的條件 / 布爾操作符講解完畢


4. Demo地址

上述所有的Demo源代碼都存放在:Carson_Ho的Github地址:RxJava2_功能性操作符


5. 總結

  • 下面,我將用一張圖總結 RxJava2 中常用的條件 / 布爾操作符
示意圖
  • Carson帶你學RxJava系列文章:

入門
Carson帶你學Android:這是一篇清晰易懂的Rxjava入門教程
Carson帶你學Android:面向初學者的RxJava使用指南
Carson帶你學Android:RxJava2.0到底更新了什么?
原理
Carson帶你學Android:圖文解析RxJava原理
Carson帶你學Android:手把手帶你源碼分析RxJava
使用教程:操作符
Carson帶你學Android:RxJava操作符教程
Carson帶你學Android:RxJava創(chuàng)建操作符
Carson帶你學Android:RxJava功能性操作符
Carson帶你學Android:RxJava過濾操作符
Carson帶你學Android:RxJava組合/合并操作符
Carson帶你學Android:RxJava變換操作符
Carson帶你學Android:RxJava條件/布爾操作符
實戰(zhàn)
Carson帶你學Android:什么時候應該使用Rxjava?(開發(fā)場景匯總)
Carson帶你學Android:RxJava線程控制(含實例講解)
Carson帶你學Android:圖文詳解RxJava背壓策略
Carson帶你學Android:RxJava、Retrofit聯(lián)合使用匯總(含實例教程)
Carson帶你學Android:優(yōu)雅實現(xiàn)網(wǎng)絡請求嵌套回調(diào)
Carson帶你學Android:網(wǎng)絡請求輪詢(有條件)
Carson帶你學Android:網(wǎng)絡請求輪詢(無條件)
Carson帶你學Android:網(wǎng)絡請求出錯重連(結合Retrofit)
Carson帶你學Android:合并數(shù)據(jù)源
Carson帶你學Android:聯(lián)想搜索優(yōu)化
Carson帶你學Android:功能防抖
Carson帶你學Android:從磁盤/內(nèi)存緩存中獲取緩存數(shù)據(jù)
Carson帶你學Android:聯(lián)合判斷


歡迎關注Carson_Ho的簡書

不定期分享關于安卓開發(fā)的干貨,追求短、平、快,但卻不缺深度


請點贊!因為你的鼓勵是我寫作的最大動力!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容