摘要:過濾類操作符主要包含等等。獲取房源列表中的最后一套房源小區(qū)房源描述程序輸出小區(qū)中糧海景壹號房源描述南北通透,豪華五房只發(fā)射觀測序列中符合條件的最后一個數(shù)據(jù)項。
轉(zhuǎn)載請注明出處:https://zhuanlan.zhihu.com/p/21966621
RxJava系列1(簡介)
RxJava系列2(基本概念及使用介紹)
RxJava系列3(轉(zhuǎn)換操作符)
RxJava系列4(過濾操作符)
RxJava系列5(組合操作符)
RxJava系列6(從微觀角度解讀RxJava源碼)
RxJava系列7(最佳實踐)
前面一篇文章中我們介紹了轉(zhuǎn)換類操作符,那么這一章我們就來介紹下過濾類的操作符。顧名思義,這類operators主要用于對事件數(shù)據(jù)的篩選過濾,只返回滿足我們條件的數(shù)據(jù)。過濾類操作符主要包含: Filter Take TakeLast TakeUntil Skip SkipLast ElementAt Debounce Distinct DistinctUntilChanged First Last等等。
Filterfilter(Func1)用來過濾觀測序列中我們不想要的值,只返回滿足條件的值,我們看下原理圖:
還是拿前面文章中的小區(qū)Community[] communities來舉例,假設(shè)我需要賽選出所有房源數(shù)大于10個的小區(qū),我們可以這樣實現(xiàn):
Observable.from(communities) .filter(new Func1Take() { @Override public Boolean call(Community community) { return community.houses.size()>10; } }).subscribe(new Action1 () { @Override public void call(Community community) { System.out.println(community.name); } });
take(int)用一個整數(shù)n作為一個參數(shù),從原始的序列中發(fā)射前n個元素.
現(xiàn)在我們需要取小區(qū)列表communities中的前10個小區(qū)
Observable.from(communities) .take(10) .subscribe(new Action1TakeLast() { @Override public void call(Community community) { System.out.println(community.name); } });
takeLast(int)同樣用一個整數(shù)n作為參數(shù),只不過它發(fā)射的是觀測序列中后n個元素。
獲取小區(qū)列表communities中的后3個小區(qū)
Observable.from(communities) .takeLast(3) .subscribe(new Action1TakeUntil() { @Override public void call(Community community) { System.out.println(community.name); } });
takeUntil(Observable)訂閱并開始發(fā)射原始Observable,同時監(jiān)視我們提供的第二個Observable。如果第二個Observable發(fā)射了一項數(shù)據(jù)或者發(fā)射了一個終止通知,takeUntil()返回的Observable會停止發(fā)射原始Observable并終止。
ObservableobservableA = Observable.interval(300, TimeUnit.MILLISECONDS); Observable observableB = Observable.interval(800, TimeUnit.MILLISECONDS); observableA.takeUntil(observableB) .subscribe(new Subscriber () { @Override public void onCompleted() { System.exit(0); } @Override public void onError(Throwable e) { } @Override public void onNext(Long aLong) { System.out.println(aLong); } }); try { Thread.sleep(Integer.MAX_VALUE); } catch (InterruptedException e) { e.printStackTrace(); }
程序輸出:
0 1
takeUntil(Func1)通過Func1中的call方法來判斷是否需要終止發(fā)射數(shù)據(jù)。
Observable.just(1, 2, 3, 4, 5, 6, 7) .takeUntil(new Func1() { @Override public Boolean call(Integer integer) { return integer >= 5; } }).subscribe(new Action1 () { @Override public void call(Integer integer) { System.out.println(integer); } });
程序輸出:
1 2 3 4 5Skip
skip(int)讓我們可以忽略O(shè)bservable發(fā)射的前n項數(shù)據(jù)。
過濾掉小區(qū)列表communities中的前5個小區(qū)
Observable.from(communities) .skip(5) .subscribe(new Action1SkipLast() { @Override public void call(Community community) { System.out.println(community.name); } });
skipLast(int)忽略O(shè)bservable發(fā)射的后n項數(shù)據(jù)。
ElementAtelementAt(int)用來獲取元素Observable發(fā)射的事件序列中的第n項數(shù)據(jù),并當(dāng)做唯一的數(shù)據(jù)發(fā)射出去。
Debouncedebounce(long, TimeUnit)過濾掉了由Observable發(fā)射的速率過快的數(shù)據(jù);如果在一個指定的時間間隔過去了仍舊沒有發(fā)射一個,那么它將發(fā)射最后的那個。通常我們用來結(jié)合RxBing(Jake Wharton大神使用RxJava封裝的Android UI組件)使用,防止button重復(fù)點擊。
debounce(Func1)可以根據(jù)Func1的call方法中的函數(shù)來過濾,F(xiàn)unc1中的中的call方法返回了一個臨時的Observable,如果原始的Observable在發(fā)射一個新的數(shù)據(jù)時,上一個數(shù)據(jù)根據(jù)Func1的call方法生成的臨時Observable還沒結(jié)束,那么上一個數(shù)據(jù)就會被過濾掉。
Distinctdistinct()的過濾規(guī)則是只允許還沒有發(fā)射過的數(shù)據(jù)通過,所有重復(fù)的數(shù)據(jù)項都只會發(fā)射一次。
過濾掉一段數(shù)字中的重復(fù)項:
Observable.just(2, 1, 2, 2, 3, 4, 3, 4, 5, 5) .distinct() .subscribe(new Action1() { @Override public void call(Integer i) { System.out.print(i + " "); } });
程序輸出:
2 1 3 4 5
distinct(Func1)參數(shù)中的Func1中的call方法會根據(jù)Observable發(fā)射的值生成一個Key,然后比較這個key來判斷兩個數(shù)據(jù)是不是相同;如果判定為重復(fù)則會和distinct()一樣過濾掉重復(fù)的數(shù)據(jù)項。
假設(shè)我們要過濾掉一堆房源中小區(qū)名重復(fù)的小區(qū):
Listhouses = new ArrayList<>(); //House構(gòu)造函數(shù)中的第一個參數(shù)為該房源所屬小區(qū)名,第二個參數(shù)為房源描述 List houses = new ArrayList<>(); houses.add(new House("中糧·海景壹號", "中糧海景壹號新出大平層!總價4500W起")); houses.add(new House("竹園新村", "滿五唯一,黃金地段")); houses.add(new House("竹園新村", "一樓自帶小花園")); houses.add(new House("中糧·海景壹號", "毗鄰湯臣一品")); houses.add(new House("中糧·海景壹號", "頂級住宅,給您總統(tǒng)般尊貴體驗")); houses.add(new House("竹園新村", "頂層戶型,兩室一廳")); houses.add(new House("中糧·海景壹號", "南北通透,豪華五房")); Observable.from(houses) .distinct(new Func1 () { @Override public String call(House house) { return house.communityName; } }).subscribe(new Action1 () { @Override public void call(House house) { System.out.println("小區(qū):" + house.communityName + "; 房源描述:" + house.desc); } });
程序輸出:
小區(qū):中糧·海景壹號; 房源描述:中糧海景壹號新出大平層!總價4500W起 小區(qū):竹園新村; 房源描述:滿五唯一,黃金地段DistinctUntilChanged
distinctUntilChanged()和distinct()類似,只不過它判定的是Observable發(fā)射的當(dāng)前數(shù)據(jù)項和前一個數(shù)據(jù)項是否相同。
同樣還是上面過濾數(shù)字的例子:
Observable.just(2, 1, 2, 2, 3, 4, 3, 4, 5, 5) .distinctUntilChanged() .subscribe(new Action1() { @Override public void call(Integer i) { System.out.print(i + " "); } });
程序輸出:
2 1 2 3 4 3 4 5
distinctUntilChanged(Func1)和distinct(Func1)一樣,根據(jù)Func1中call方法產(chǎn)生一個Key來判斷兩個相鄰的數(shù)據(jù)項是否相同。
我們還是拿前面的過濾房源的例子:
Observable.from(houses) .distinctUntilChanged(new Func1() { @Override public String call(House house) { return house.communityName; } }).subscribe(new Action1 () { @Override public void call(House house) { System.out.println("小區(qū):" + house.communityName + "; 房源描述:" + house.desc); } });
程序輸出:
小區(qū):中糧·海景壹號; 房源描述:中糧海景壹號新出大平層!總價4500W起 小區(qū):竹園新村; 房源描述:滿五唯一,黃金地段 小區(qū):中糧·海景壹號; 房源描述:毗鄰湯臣一品 小區(qū):竹園新村; 房源描述:頂層戶型,兩室一廳 小區(qū):中糧·海景壹號; 房源描述:南北通透,豪華五房First
first()顧名思義,它是的Observable只發(fā)送觀測序列中的第一個數(shù)據(jù)項。
獲取房源列表houses中的第一套房源:
Observable.from(houses) .first() .subscribe(new Action1() { @Override public void call(House house) { System.out.println("小區(qū):" + house.communityName + "; 房源描述:" + house.desc); } });
程序輸出:
小區(qū):中糧·海景壹號; 房源描述:中糧海景壹號新出大平層!總價4500W起
first(Func1)只發(fā)送符合條件的第一個數(shù)據(jù)項。
現(xiàn)在我們要獲取房源列表houses中小區(qū)名為竹園新村的第一套房源。
Observable.from(houses) .first(new Func1() { @Override public Boolean call(House house) { return "竹園新村".equals(house.communityName); } }) .subscribe(new Action1 () { @Override public void call(House house) { System.out.println("小區(qū):" + house.communityName + "; 房源描述:" + house.desc); } });
程序輸出:
小區(qū):竹園新村; 房源描述:滿五唯一,黃金地段Last
last()只發(fā)射觀測序列中的最后一個數(shù)據(jù)項。
獲取房源列表中的最后一套房源:
Observable.from(houses) .last() .subscribe(new Action1() { @Override public void call(House house) { System.out.println("小區(qū):" + house.communityName + "; 房源描述:" + house.desc); } });
程序輸出:
小區(qū):中糧·海景壹號; 房源描述:南北通透,豪華五房
last(Func1)只發(fā)射觀測序列中符合條件的最后一個數(shù)據(jù)項。
獲取房源列表houses中小區(qū)名為竹園新村的最后一套房源:
Observable.from(houses) .last(new Func1() { @Override public Boolean call(House house) { return "竹園新村".equals(house.communityName); } }) .subscribe(new Action1 () { @Override public void call(House house) { System.out.println("小區(qū):" + house.communityName + "; 房源描述:" + house.desc); } });
程序輸出:
小區(qū):竹園新村; 房源描述:頂層戶型,兩室一廳
這一章我們就先聊到這,更多的過濾類操作符的介紹大家可以去查閱官方文檔和源碼;在下一章我們將繼續(xù)介紹組合類操作符。
如果大家喜歡這一系列的文章,歡迎關(guān)注我的知乎專欄和GitHub。
知乎專欄:https://zhuanlan.zhihu.com/baron
GitHub:https://github.com/BaronZ88
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66505.html
摘要:請欣賞語法清單后端掘金語法清單翻譯自的,從屬于筆者的入門與實踐系列。這篇一篇框架整合友好的文章三后端掘金一理論它始終是圍繞數(shù)據(jù)模型頁面進(jìn)行開發(fā)的。 RxJava 常用操作符 - Android - 掘金 原文地址 http://reactivex.io/documenta... ... RxJava 和 Retrofit 結(jié)合使用完成基本的登錄和注冊功能 - Android - 掘...
摘要:探索專為而設(shè)計的將探討進(jìn)行了何種改進(jìn),以及這些改進(jìn)背后的原因。關(guān)于最友好的文章進(jìn)階前言之前就寫過一篇關(guān)于最友好的文章反響很不錯,由于那篇文章的定位就是簡單友好,因此盡可能的摒棄復(fù)雜的概念,只抓住關(guān)鍵的東西來講,以保證大家都能看懂。 周月切換日歷 一個可以進(jìn)行周月切換的日歷,左右滑動的切換月份,上下滑動可以進(jìn)行周,月不同的視圖切換,可以進(jìn)行事件的標(biāo)記,以及節(jié)假日的顯示,功能豐富 Andr...
摘要:按照計劃這一期是要介紹框架結(jié)構(gòu)和設(shè)計思想的,但是考慮到將在十月底發(fā)布正式版因此決定將框架結(jié)構(gòu)和設(shè)計思想分析放到正式版發(fā)布后再做。后續(xù)我也會有一系列的文章來介紹和的區(qū)別。首選我們需要調(diào)用系統(tǒng)來獲取所有已安裝的,所以在的方法中調(diào)用。 轉(zhuǎn)載請注明出處:[https://zhuanlan.zhihu.com/p/... RxJava系列1(簡介) RxJava系列2(基本概念及使用介紹) R...
閱讀 2959·2023-04-25 17:46
閱讀 3588·2021-11-25 09:43
閱讀 1092·2021-11-18 10:02
閱讀 3051·2021-10-14 09:43
閱讀 2767·2021-10-13 09:40
閱讀 1524·2021-09-28 09:35
閱讀 2184·2019-08-30 15:52
閱讀 3154·2019-08-30 14:06