RxJava系列之常用過濾操作符

系列文章

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

過濾操作符

上篇文章中,我們學習了變換操作符。 過濾操作符顧名思義就是對數據的篩選與過濾,與變換操作符的位置相同,作用不同。

filter

如果過濾操作符的方法返回false,則過濾掉該條數據,返回true則不過濾該條數據。

  /**
     * filter 過濾
     * 需求:過濾掉 哪些不合格的奶粉,輸出哪些合格的奶粉
     * @param view
     */
    public void r01(View view) {

        // 上游
        Observable.just("三鹿", "合生元", "飛鶴")

        .filter(new Predicate<String>() {
            @Override
            public boolean test(String s) throws Exception {
                // return true; // 不去過濾,默認全部都會打印
                // return false; // 如果是false 就全部都不會打印

                if ("三鹿".equals(s)) {
                    return false; // 不合格
                }

                return true;
            }
        })

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

take

take過濾操作符需要跟定時器配合使用,是定時器的停止條件。

/**
     * take過濾操作符
     * @param view
     */
    public void r02(View view) {
        // 定時器 運行   只有再定時器運行基礎上 加入take過濾操作符,纔有take過濾操作符的價值

        // 上游
        Observable.interval(2, TimeUnit.SECONDS)

                // 增加過濾操作符,停止定時器
                .take(8) // 執行次數達到8 停止下來

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

    }

distinct

distinct過濾操作符可以過濾掉相同數據的,底層應該調用了equals方法判斷兩個對象是否相同。

 /**
     * distinct過濾重複事件
     * @param view
     */
    public void r03(View view) {
        // 上游
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onNext(4);
                e.onNext(4);
                e.onComplete();
            }
        })

        .distinct() // 過濾重複 發射的事件

        .subscribe(new Consumer<Integer>() { // 下游 觀察者
            @Override
            public void accept(Integer integer) throws Exception {
                Log.d(TAG, "accept: " + integer); // 事件不重複
            }
        });
    }

elementAt

elementAt過濾操作符只要指定索引置爲的數據,其它數據都不要了

 /**
     * elementAt 指定過濾的內容
     * @param view
     */
    public void r04(View view) {
        // 上游
        Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                e.onNext("九陰真經");
                e.onNext("九陽真經");
                e.onNext("易筋經");
                e.onNext("神照經");
                e.onComplete();
            }
        })

        // 過濾操作符
        .elementAt(100, "默認經") // 指定下標輸出 事件

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


    }

總結

上游 -------> 過濾操作(往右邊流向的時候,進行過濾) ----------> 下游
1.filter 如果是false全部都發射給下游,如果是true,全部都不發射給下游。

2.take :只有再定時器運行基礎上 加入take過濾操作符,纔有take過濾操作符的價值。

3.distinct過濾重複事件。

4.elementAt 指定保留索引位置發射事件的內容,如果無法指定,有默認的事件。

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