1. 程式人生 > >初識RxJava(五)過濾類 操作符

初識RxJava(五)過濾類 操作符

前言:

前面已經記錄了四種操作符,分別是 建立、延時、轉換、組合 操作符,每天閒來無事看一篇。找個時間 寫個demo 敲一下,然後就大體記住了,會用的第一步是記住 ,記住的第一步 是認識。下面開始 過濾 操作符的 筆記記錄;

正文:

1、filter 操作符

1)、作用

從被觀察者內過濾掉不符合需求條件的 內容,將符合條件的內容 發射給 觀察者;

2)、程式碼
 /**
     * filter 操作符
     */
    private void filterMethod() {
        Observable.just(1, 2, 3, 4, 5, 6, 7).filter(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) throws Exception {
                return integer > 4;
            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                logDUtils("onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                logDUtils("onNext:" + integer);
            }

            @Override
            public void onError(Throwable e) {
                logDUtils("onError:" + e.getMessage());
            }

            @Override
            public void onComplete() {
                logDUtils("onComplete");
            }
        });
    }
3)、效果

效果

2、ofType 操作符

1)、作用

用於過濾被觀察者 傳送的資料 得到指定型別資料,將篩選後的資料 在 觀察者那裡進行接收;

2)、程式碼
 /**
     * ofType 操作符
     */
    private void ofTypeMethod() {
        Observable.just(1, "Android", "Java", 4, "航展")
                .ofType(String.class).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                logDUtils("onSubscribe");
            }

            @Override
            public void onNext(String s) {
                logDUtils("onNext:" + s);
            }

            @Override
            public void onError(Throwable e) {
                logDUtils("onError:" + e.getMessage());
            }

            @Override
            public void onComplete() {
                logDUtils("onComplete");
            }
        });
    }
3)、效果

效果

3、skip 操作符 和 skipLast 操作符

1)、作用

skip: 跳過發射事件 的前 n 個 資料;
skipLast :跳過發射事件 的後 n 個 資料。

2)、程式碼
  /**
     * skip 操作符 和 skipLast 操作符
     */
    @SuppressLint("CheckResult")
    private void skipMethod() {
        Observable.just(1, 2, 3, 4, 5, 6, 7, 8).skip(2).skipLast(3)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        logDUtils("accept:" +integer);
                    }
                });
    }
3)、效果

效果

4、distinct 操作符 和 distinctUntilChanged 操作符

1)、作用

distinct : 過濾重複的事件

distinctUntilChanged : 過濾連續重複事件

2)、程式碼
  /**
     * distinct 操作符 和  distinctUntilChanged 操作符
     */

    @SuppressLint("CheckResult")
    private void distinctMethod() {
        Observable.just(1, 22, 33, 44, 55, 33, 1, 22).distinct().subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                logDUtils("distinct--->accept:" + integer);
            }
        });

        Observable.just(1, 1, 2, 3, 4, 4, 5, 6, 6,5).distinctUntilChanged().subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                logDUtils("distinctUntilChanged--->accept:" + integer);
            }
        });
    }
3)、效果

效果

5、take 操作符 和 takeLast 操作符

1)、作用

take :只獲取 被觀察者 傳送的資料的 前幾位數據
takeLast :只獲取 被觀察 傳送的資料 的後幾位數據

2)、程式碼
  /**
     * take 操作符 和 takeLast 操作符
     */
    @SuppressLint("CheckResult")
    private void takeMethod() {
        Observable.just(1, 2, 3, 4, 5, 6, 7).take(3).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                logDUtils("take--->onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                logDUtils("take--->onNext:" + integer);
            }

            @Override
            public void onError(Throwable e) {
                logDUtils("take--->onError:" + e.getMessage());
            }

            @Override
            public void onComplete() {
                logDUtils("take--->onComplete");
            }
        });


        Observable.just(1, 2, 3, 4, 5, 6, 78, 9).takeLast(4).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                logDUtils("takeLast--->onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                logDUtils("takeLast--->onNext:" + integer);
            }

            @Override
            public void onError(Throwable e) {
                logDUtils("takeLast--->onError:" + e.getMessage());
            }

            @Override
            public void onComplete() {
                logDUtils("takeLast--->onComplete");
            }
        });
    }
3)、效果

效果

6、throttleFirst 操作符 和 throttleLast 操作符

1)、作用

throttleFirst :規定事件內 只發送 這段時間內的 第 1 次資料
throttleLast :規定事件內 只發送 這段時間內的 最後 1 次資料

2)、程式碼

    /**
     * throttleFirst 操作符 和 throttleLast 操作符
     */
    @SuppressLint("CheckResult")
    private void throttleFirstAndThrottleLastMethod() {
        Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                emitter.onNext("a");
                Thread.sleep(400);
                emitter.onNext("b");
                Thread.sleep(400);
                emitter.onNext("c");
                Thread.sleep(400);
                emitter.onNext("d");
                Thread.sleep(400);
                emitter.onNext("e");
                Thread.sleep(400);
                emitter.onNext("f");
            }
        }).throttleFirst(2, TimeUnit.SECONDS).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                logDUtils("throttleFirst--->accept:" + s);
            }
        });

        // interval 操作符: 從 0 開始 每隔 100 毫秒 產生一個遞增的 long 型別資料
        Observable.interval(100, TimeUnit.MILLISECONDS)
                .throttleLast(1, TimeUnit.SECONDS)
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        logDUtils("throttleLast---->accept:" + aLong);
                    }
                });
    }
3)、效果

效果

7、Sample 操作符

作用

在某段時間內,只發送該段時間內最新即最後一次 1次事件 類似於 throttleLast 操作符

8、throttleWithTimeout 操作符 和 debounce 操作符

1)、作用

只發射給 觀察者的 規定時間內 最後一個數據。

2)、程式碼
  /**
     * debounce 操作符 和 throttleWithTimeout 操作符
     */
    @SuppressLint("CheckResult")
    private void debounceAndThrottleWithTimeoutMethod() {
        //intervalRange : 開始數字為 1 數字數量為90 初始延遲1毫秒 數字間隔為100毫秒
        Observable.intervalRange(1,90,1,100, TimeUnit.MILLISECONDS)
                .debounce(101, TimeUnit.MILLISECONDS)
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        logDUtils("accept:" + aLong);
                    }
                });
    }

3)、效果

效果

8、elementAt 操作符

1)、作用

獲取指定索引處的 資料

2)、程式碼
  /**
     * elementAt  操作符
     */
    @SuppressLint("CheckResult")
    private void elementAtMethod() {
        Observable.just(1, 2, 3, 4, 5, 6, 7).elementAt(4).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                logDUtils("accept:" + integer);
            }
        });
    }

#####3)、效果
效果

注意: 初始索引為 0

9、firstElement 操作符 和 lastElement 操作符

1)、作用

firstElement :獲取首個 資料
lastElement :獲取最後一個數據

2)、程式碼
  /**
     * firstElement 操作符 和 lastElement 操作符
     */
    @SuppressLint("CheckResult")
    private void firstElementAndLastElementMethod() {
        Observable.just("首個", "a", "b", "c").firstElement().subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                logDUtils("accept:" + s);
            }
        });
    }
3)、效果

效果

10、elementAtOrError操作符

作用

與 elementAt 操作符配合使用,當出現越界的情況 丟擲異常。