RxJava系列之常用條件操作符

系列文章

RxJava系列之簡介和觀察者設計模式
RxJava系列之上游與下游
RxJava系列之常用創建型操作符
RxJava系列之常用變換操作符
RxJava系列之常用過濾操作符
RxJava系列之常用條件操作符
RxJava系列之常用合併操作符
RxJava系列之常用異常操作符
RxJava系列之線程切換實戰
RxJava系列之背壓模式
RxJava系列之配合Retrofit
RxJava系列之泛型高級
RxJava系列之手寫create操作符
RxJava系列之手寫create操作符增加泛型限定
RxJava系列之手寫just操作符
RxJava系列之手寫map操作符
RxJava系列之手寫切換線程

條件操作符

將上游發射的數據進行判斷,下游的接收都是Boolean的。滿足條件,下游接收到true,不滿足條件,下游接收到false。

all

所有數據都滿足條件,下游就接收到true,其中有一個不滿足條件,就接收到false。

 /**
     * all,如同 if 那樣的功能 :全部爲true,纔是true,只要有一個爲false,就是false
     * @param view
     */
    public void r01(View view) {

        String v1 = "1";
        String v2 = "2";
        String v3 = "3";
        String v4 = "cc";

        // 需求:只要有一個爲 cc的,就是false

        // 平常的寫法
        // if (v1.equals("cc") || v2.equals("cc") || v3.equals("cc") || v4.equals("cc")) {
        if (v1 == null) {
            Log.d(TAG, "r01: " + false);
        } else {
            Log.d(TAG, "r01: " + true);
        }

        // RxJava的寫法
        // 上游
        Observable.just(v1, v2, v3, v4) // RxJava 2.X 之後 不能傳遞null,否則會報錯

        .all(new Predicate<String>() {
            @Override
            public boolean test(String s) throws Exception {
                return !s.equals("cc"); // 如果s不等於cc,就是true
            }
        })

        .subscribe(new Consumer<Boolean>() { // 下游
            @Override
            public void accept(Boolean s) throws Exception {
                Log.d(TAG, "accept: " + s);
            }
        });
    }

contains

包含某條數據,下游就接收到true,所有數據都不包含,則下游接收到false

 /**
     * contains 是否包含
     * @param view
     */
    public void r02(View view) {

        Observable.just("JavaSE", "JavaEE", "JavaME", "Android", "iOS", "Rect.js", "NDK")

        .contains("C")     // 是否包含了 Android,條件是否滿足

        .subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean s) throws Exception {
                Log.d(TAG, "accept: " + s);
            }
        });
    }

any

any和all是相反的。any是全部爲false,下游接收到false,有一個是true,下游接收到就是true

  /**
     * Any 和 All相反的,All全部爲true,纔是true,只要有一個爲false,就是false
     * any 全部爲 false,纔是false, 只要有一個爲true,就是true
     * @param view
     */
    public void r03(View view) {

        Observable.just("JavaSE", "JavaEE", "JavaME", "Android", "iOS", "Rect.js", "NDK")

                .any(new Predicate<String>() {
                    @Override
                    public boolean test(String s) throws Exception {
                        return s.equals("Android");
                    }
                })     // 是否包含了 Android,條件是否滿足

                .subscribe(new Consumer<Boolean>() {
                    @Override
                    public void accept(Boolean s) throws Exception {
                        Log.d(TAG, "accept: " + s);
                    }
                });

    }

總結

上游 -------> 條件操作(往右邊流向的時候,條件判斷) ----------> 下游

All: 如同 if 那樣的功能 :全部爲true,纔是true,只要有一個爲false,就是false.
contains 是否包含
any 全部爲 false,纔是false, 只要有一個爲true,就是true

如果使用了條件操作符,下一層,接收的類型 就是條件類型(Boolean)

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