RxJava學(xué)習(xí)筆記操作符學(xué)習(xí)(6)

過濾操作符
  • 作用

過濾 / 篩選 被觀察者(Observable)發(fā)送的事件 & 觀察者 (Observer)接收的事件

  • 類型
類型圖.png
  • 應(yīng)用場景 & 對應(yīng)操作符詳解

1.Filter()
作用
過濾 特定條件的事件。
實例

public void FilterOperators(View view){
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onNext(4);
                emitter.onNext(5);
                
            }
        }).filter(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) throws Exception {
                return integer>3;
            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.e("sss", "開始采用subscribe連接");
            }

            @Override
            public void onNext(Integer integer) {
                Log.e("sss", "過濾后得到的事件是:"+ integer );
            }

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

            @Override
            public void onComplete() {
                Log.e("sss", "對Complete事件作出響應(yīng)");
            }
        });
    }

2.ofType()
作用
過濾 特定數(shù)據(jù)類型的數(shù)據(jù)
事例

public void ofTypeOperators(View view){
      Observable.just(1,"hh",6,"lll",8)
                .ofType(Integer.class)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.e("sss","獲取到的整型事件元素是: "+ integer);
                    }
                });
    }

3.skip() / skipLast()
作用
跳過某個事件
事例

public void skipOperators(View view){
        Observable.just(1,2,3,4,5)
                .skip(1)
                .skipLast(2)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.e("sss","獲取到的整型事件元素是: "+ integer);
                    }
                });
    }

4.distinct() / distinctUntilChanged()
作用
過濾事件序列中重復(fù)的事件 / 連續(xù)重復(fù)的事件
事例

 public void distinctOperators(View view){
        Observable.just(1,2,5,1,5,6,3)
                .distinct()
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.e("sss","獲取到的不重復(fù)事件元素是: "+ integer);
                    }
                });
    }

5.take()
作用
指定觀察者最多能接收到的事件數(shù)量
事例

 public void takeOperators(View view){
        Observable.just(1,2,3,4,6)
                .take(2)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.e("sss","獲取到的事件元素是: "+ integer);
                    }
                });
    }

6.takeLast()
作用
指定觀察者只能接收到被觀察者發(fā)送的最后幾個事件
事例

public void takeLastOperators(View view){
        Observable.just(1,2,3,4,5)
                .takeLast(3)
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.e("sss", "開始采用subscribe連接");
                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.e("sss", "接受后得到的事件是:"+ integer );
                    }

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

                    @Override
                    public void onComplete() {
                        Log.e("sss", "對Complete事件作出響應(yīng)");
                    }
                });
    }

7.throttleFirst()/ throttleLast()
作用
在某段時間內(nèi),只發(fā)送該段時間內(nèi)第1次事件 / 最后1次事件
事例

public void throttleFirstOperators(View view){
        Observable.create(new ObservableOnSubscribe<Integer>() {

            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                Thread.sleep(500);
                emitter.onNext(2);
                Thread.sleep(400);
                emitter.onNext(3);
                Thread.sleep(300);

                emitter.onNext(4);
                Thread.sleep(300);

                emitter.onNext(5);
                Thread.sleep(300);

                emitter.onNext(6);
                Thread.sleep(400);

                emitter.onNext(7);
                Thread.sleep(300);
                emitter.onNext(8);

                Thread.sleep(300);
                emitter.onNext(9);

                Thread.sleep(300);
                emitter.onComplete();

            }
        }).throttleFirst(1, TimeUnit.SECONDS)
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.e("sss", "開始采用subscribe連接");
                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.e("sss", "接收到了事件"+ integer  );
                    }

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

                    @Override
                    public void onComplete() {
                        Log.e("sss","對Complete事件作出響應(yīng)");
                    }
                });
    }

8.Sample()
作用
在某段時間內(nèi),只發(fā)送該段時間內(nèi)最新(最后)1次事件與 throttleLast() 操作符類似。
9.throttleWithTimeout () / debounce()
作用
發(fā)送數(shù)據(jù)事件時,若2次發(fā)送事件的間隔<指定時間,就會丟棄前一次的數(shù)據(jù),直到指定時間內(nèi)都沒有新數(shù)據(jù)發(fā)射時才會發(fā)送后一次的數(shù)據(jù)。
事例

public void throttleWithTimeoutOperators(View view){
        Observable.create(new ObservableOnSubscribe<Integer>() {

            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                Thread.sleep(500);
                emitter.onNext(2);
                Thread.sleep(1500);
                emitter.onNext(3);
                Thread.sleep(1500);
                emitter.onNext(4);
                Thread.sleep(500);
                emitter.onNext(5);
                Thread.sleep(1500);
                emitter.onNext(6);
                Thread.sleep(500);
                emitter.onComplete();
            }
        }).throttleWithTimeout(1,TimeUnit.MICROSECONDS)
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.e("sss", "接收到了事件"+ integer  );
                    }

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

                    @Override
                    public void onComplete() {
                        Log.e("sss", "對Complete事件作出響應(yīng)");
                    }
                });
    }
  1. firstElement() / lastElement()
    作用
    僅選取第1個元素 / 最后一個元素
    事例
public void firstElementOperators(View view){
        Observable.just(1,2,3,4,5)
                .firstElement()
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.e("sss","獲取到的第一個事件是: "+ integer);
                    }
                });
    }

11.elementAt()
作用
指定接收某個元素(通過 索引值 確定)。
事例

public void elementAtOperators(View view){
        Observable.just(1,2,3,4,5)
                .elementAt(2)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.e("sss","獲取到的事件元素是: "+ integer);
                    }
                });
    }

12.elementAtOrError()
作用
在elementAt()的基礎(chǔ)上,當(dāng)出現(xiàn)越界情況(即獲取的位置索引 > 發(fā)送事件序列長度)時,即拋出異常。
事例

  public void elementAtOrErrorOperators(View view){
        Observable.just(1,2,3,4,5)
                .elementAtOrError(6)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.e("sss","獲取到的事件元素是: "+ integer);
                    }
                });

    }
  • 實際開發(fā)中的應(yīng)用

1.功能防抖
throttleFirst的使用

Button bt=findViewById(R.id.bt);

        RxView.clicks(bt)
                .throttleFirst(4, TimeUnit.SECONDS)
                .subscribe(new Observer<Object>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Object o) {
                        Log.e("sss", "發(fā)送了網(wǎng)絡(luò)請求" );
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("sss", "對Error事件作出響應(yīng)" + e.toString());
                    }

                    @Override
                    public void onComplete() {
                        Log.e("sss", "對Complete事件作出響應(yīng)");
                    }
                });
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡潔易...
    測天測地測空氣閱讀 685評論 0 1
  • 一、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡潔易...
    無求_95dd閱讀 3,513評論 0 21
  • 前言 Rxjava,由于其基于事件流的鏈?zhǔn)秸{(diào)用、邏輯簡潔 & 使用簡單的特點,深受各大 Android開發(fā)者的歡迎...
    Carson帶你學(xué)安卓閱讀 22,658評論 10 62
  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位,與響應(yīng)式編程作為結(jié)合使用的,對什么是操作、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,994評論 0 10
  • 有時候,閱讀是一段人生。蛻一層皮,然后嶄新地活了過來。 進入書里的世界,與彼此的心意有關(guān)。如果太執(zhí)著于眼前的生活,...
    如果miya閱讀 476評論 0 1

友情鏈接更多精彩內(nèi)容