Rxjava操作符講解(3)Filtering 過濾操作

之前沒有了解過Rxjava的童鞋,建議先閱讀《Rxjava 從入門到開發》這篇文章,對入門比較有幫助。

Debounce操作符

作用:僅在過了一段指定的時間還沒發射數據時才發射一個數據

Observable.create(new Observable.OnSubscribe<Integer>() {
        @Override
        public void call(Subscriber<? super Integer> subscriber) {
            try {
                for(int i=1;i<5;i++){
                    subscriber.onNext(i);
                    //時間延遲為0、100、200...900毫秒
                    Thread.sleep(i*100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).debounce(300,TimeUnit.MILLISECONDS).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            Logger.i(String.valueOf(integer));
        }
    });

輸出結果:

例子說明:輸出結果1,2時間在300ms內,一次被過濾掉了,3,4輸出時間間隔為300ms和400ms所以被保留。

Distinct操作符

作用:抑制(過濾掉)重復的數據項

Observable.create(new Observable.OnSubscribe<Integer>() {
        @Override
        public void call(Subscriber<? super Integer> subscriber) {
            for(int i=0;i<10;i++){
                subscriber.onNext(random.nextInt(3));
            }
        }
    }).distinct().observeOn(Schedulers.io()).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            Logger.i(String.valueOf(integer));
        }
    });

輸出結果:

例子說明:例子原來應該輸出10個結果,但是在操作符distinct過濾重復結果的作用下,實際輸出3個結果。

Filter操作符

作用:輸出過濾條件后的結果項

Observable.create(new Observable.OnSubscribe<Integer>() {
        @Override
        public void call(Subscriber<? super Integer> subscriber) {
            for(int i=0;i<10;i++){
                subscriber.onNext(random.nextInt(20));
            }
        }
    }).filter(new Func1<Integer, Boolean>() {
        @Override
        public Boolean call(Integer integer) {
            return 10<integer&&integer<15;
        }
    }).observeOn(Schedulers.io()).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            Logger.i(String.valueOf(integer));
        }
    });

輸出結果:

例子說明:例子隨機輸出10項數據,在filter的條件作用下,最終實際輸出符合條件的兩項數據結果。

Sample操作符

作用:定期發射Observable最近發射的數據項

Observable.create(new Observable.OnSubscribe<Integer>() {
        @Override
        public void call(Subscriber<? super Integer> subscriber) {
            try {
                for(int i=1;i<5;i++){
                    subscriber.onNext(i);
                    Thread.sleep(100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).sample(300,TimeUnit.MILLISECONDS).observeOn(Schedulers.io()).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            Logger.i(String.valueOf(integer));
        }
    });

輸出結果:

例子說明:demo連續輸出5項數據,間隔為100毫秒,通過Sample操作符作用,每300毫秒輸出最后一項數據,故最后輸出結果為3,4。

在此需要再解析下Sample和Debounce操作符的區別,其實兩者功能很相似,感覺都是在過一段時間后輸出最后一項數據,但不同的是Sample是周期輸出,而Debounce是針對指定時間段,以Sample的demo說明,demo的結果輸出是3,4。但是如果操作符改成debounce,那么輸出結果僅有4,為什么呢?因為sample是周期性輸出,就無論如何每隔300ms就要輸出一次結果,但是debounce不同,它在300ms的時候要輸出3了,還得判斷3后的300ms是否有數據輸出,如果有那么就通過最新的數據再按照類似的規則繼續判斷是否輸出新數據,如果沒有,那么就輸出,所以最終輸出的結果是4。

Skip操作符

作用:跳過開始的N項數據

Observable.interval(1, TimeUnit.SECONDS).skip(2).observeOn(Schedulers.io()).subscribe(new Action1<Long>() {
        @Override
        public void call(Long aLong) {
            Logger.i(String.valueOf(aLong));
        }
    });

輸出結果:

例子說明:本來正常輸出結果為0,1,2,3... 現在輸出結果為2,3,4...跳過了前面兩項。

Take操作符

作用:只發射開始的N項數據

Observable.interval(1, TimeUnit.SECONDS).take(2).subscribe(new Action1<Long>() {
        @Override
        public void call(Long aLong) {
            Logger.i(String.valueOf(aLong));
        }
    });

輸出結果:


例子說明:本來正常輸出結果為0,1,2,3... 現在輸出結果為0,1只保留前面兩項。

以上便是過濾操作符的主要內容了。有啥問題歡迎大家留言交流下??,下篇文章再說說結合操作符歡迎關注。

附錄:
文章demo

參考:
ReactiveX/RxJava文檔中文版

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

推薦閱讀更多精彩內容