日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

RxJava系列四(过滤操作符)

發布時間:2024/4/13 java 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RxJava系列四(过滤操作符) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請注明出處:https://zhuanlan.zhihu.com/p/21966621

  • RxJava系列1(簡介)

  • RxJava系列2(基本概念及使用介紹)

  • RxJava系列3(轉換操作符)

  • RxJava系列4(過濾操作符)

  • RxJava系列5(組合操作符)

  • RxJava系列6(從微觀角度解讀RxJava源碼)

  • RxJava系列7(最佳實踐)


前面一篇文章中我們介紹了轉換類操作符,那么這一章我們就來介紹下過濾類的操作符。顧名思義,這類operators主要用于對事件數據的篩選過濾,只返回滿足我們條件的數據。過濾類操作符主要包含: Filter Take TakeLast TakeUntil Skip SkipLast ElementAt Debounce Distinct DistinctUntilChanged First Last等等。

Filter

filter(Func1)用來過濾觀測序列中我們不想要的值,只返回滿足條件的值,我們看下原理圖:

還是拿前面文章中的小區Community[] communities來舉例,假設我需要賽選出所有房源數大于10個的小區,我們可以這樣實現:

Observable.from(communities).filter(new Func1<Community, Boolean>() {@Overridepublic Boolean call(Community community) {return community.houses.size()>10;}}).subscribe(new Action1<Community>() {@Overridepublic void call(Community community) {System.out.println(community.name);} });

Take

take(int)用一個整數n作為一個參數,從原始的序列中發射前n個元素.

現在我們需要取小區列表communities中的前10個小區

Observable.from(communities).take(10).subscribe(new Action1<Community>() {@Overridepublic void call(Community community) {System.out.println(community.name);}});

TakeLast

takeLast(int)同樣用一個整數n作為參數,只不過它發射的是觀測序列中后n個元素。

獲取小區列表communities中的后3個小區

Observable.from(communities).takeLast(3).subscribe(new Action1<Community>() {@Overridepublic void call(Community community) {System.out.println(community.name);}});

TakeUntil

takeUntil(Observable)訂閱并開始發射原始Observable,同時監視我們提供的第二個Observable。如果第二個Observable發射了一項數據或者發射了一個終止通知,takeUntil()返回的Observable會停止發射原始Observable并終止。

Observable<Long> observableA = Observable.interval(300, TimeUnit.MILLISECONDS); Observable<Long> observableB = Observable.interval(800, TimeUnit.MILLISECONDS);observableA.takeUntil(observableB).subscribe(new Subscriber<Long>() {@Overridepublic void onCompleted() {System.exit(0);}@Overridepublic void onError(Throwable e) {}@Overridepublic 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方法來判斷是否需要終止發射數據。

Observable.just(1, 2, 3, 4, 5, 6, 7).takeUntil(new Func1<Integer, Boolean>() {@Overridepublic Boolean call(Integer integer) {return integer >= 5;}}).subscribe(new Action1<Integer>() {@Overridepublic void call(Integer integer) {System.out.println(integer);}});

程序輸出:

1 2 3 4 5

Skip

skip(int)讓我們可以忽略Observable發射的前n項數據。

過濾掉小區列表communities中的前5個小區

Observable.from(communities).skip(5).subscribe(new Action1<Community>() {@Overridepublic void call(Community community) {System.out.println(community.name);}});

SkipLast

skipLast(int)忽略Observable發射的后n項數據。

ElementAt

elementAt(int)用來獲取元素Observable發射的事件序列中的第n項數據,并當做唯一的數據發射出去。

Debounce

debounce(long, TimeUnit)過濾掉了由Observable發射的速率過快的數據;如果在一個指定的時間間隔過去了仍舊沒有發射一個,那么它將發射最后的那個。通常我們用來結合RxBing(Jake Wharton大神使用RxJava封裝的Android UI組件)使用,防止button重復點擊。

debounce(Func1)可以根據Func1的call方法中的函數來過濾,Func1中的中的call方法返回了一個臨時的Observable,如果原始的Observable在發射一個新的數據時,上一個數據根據Func1的call方法生成的臨時Observable還沒結束,那么上一個數據就會被過濾掉。

Distinct

distinct()的過濾規則是只允許還沒有發射過的數據通過,所有重復的數據項都只會發射一次。

過濾掉一段數字中的重復項:

Observable.just(2, 1, 2, 2, 3, 4, 3, 4, 5, 5).distinct().subscribe(new Action1<Integer>() {@Overridepublic void call(Integer i) {System.out.print(i + " ");}});

程序輸出:

2 1 3 4 5

distinct(Func1)參數中的Func1中的call方法會根據Observable發射的值生成一個Key,然后比較這個key來判斷兩個數據是不是相同;如果判定為重復則會和distinct()一樣過濾掉重復的數據項。

假設我們要過濾掉一堆房源中小區名重復的小區:

List<House> houses = new ArrayList<>(); //House構造函數中的第一個參數為該房源所屬小區名,第二個參數為房源描述 List<House> houses = new ArrayList<>(); houses.add(new House("中糧·海景壹號", "中糧海景壹號新出大平層!總價4500W起")); houses.add(new House("竹園新村", "滿五唯一,黃金地段")); houses.add(new House("竹園新村", "一樓自帶小花園")); houses.add(new House("中糧·海景壹號", "毗鄰湯臣一品")); houses.add(new House("中糧·海景壹號", "頂級住宅,給您總統般尊貴體驗")); houses.add(new House("竹園新村", "頂層戶型,兩室一廳")); houses.add(new House("中糧·海景壹號", "南北通透,豪華五房")); Observable.from(houses).distinct(new Func1<House, String>() {@Overridepublic String call(House house) {return house.communityName;}}).subscribe(new Action1<House>() {@Overridepublic void call(House house) {System.out.println("小區:" + house.communityName + "; 房源描述:" + house.desc);}});

程序輸出:

小區:中糧·海景壹號; 房源描述:中糧海景壹號新出大平層!總價4500W起 小區:竹園新村; 房源描述:滿五唯一,黃金地段

DistinctUntilChanged

distinctUntilChanged()和distinct()類似,只不過它判定的是Observable發射的當前數據項和前一個數據項是否相同。

同樣還是上面過濾數字的例子:

Observable.just(2, 1, 2, 2, 3, 4, 3, 4, 5, 5).distinctUntilChanged().subscribe(new Action1<Integer>() {@Overridepublic void call(Integer i) {System.out.print(i + " ");}});

程序輸出:

2 1 2 3 4 3 4 5

distinctUntilChanged(Func1)和distinct(Func1)一樣,根據Func1中call方法產生一個Key來判斷兩個相鄰的數據項是否相同。

我們還是拿前面的過濾房源的例子:

Observable.from(houses).distinctUntilChanged(new Func1<House, String>() {@Overridepublic String call(House house) {return house.communityName;}}).subscribe(new Action1<House>() {@Overridepublic void call(House house) {System.out.println("小區:" + house.communityName + "; 房源描述:" + house.desc);} });

程序輸出:

小區:中糧·海景壹號; 房源描述:中糧海景壹號新出大平層!總價4500W起 小區:竹園新村; 房源描述:滿五唯一,黃金地段 小區:中糧·海景壹號; 房源描述:毗鄰湯臣一品 小區:竹園新村; 房源描述:頂層戶型,兩室一廳 小區:中糧·海景壹號; 房源描述:南北通透,豪華五房

First

first()顧名思義,它是的Observable只發送觀測序列中的第一個數據項。

獲取房源列表houses中的第一套房源:

Observable.from(houses).first().subscribe(new Action1<House>() {@Overridepublic void call(House house) {System.out.println("小區:" + house.communityName + "; 房源描述:" + house.desc);} });

程序輸出:

小區:中糧·海景壹號; 房源描述:中糧海景壹號新出大平層!總價4500W起

first(Func1)只發送符合條件的第一個數據項。

現在我們要獲取房源列表houses中小區名為竹園新村的第一套房源。

Observable.from(houses).first(new Func1<House, Boolean>() {@Overridepublic Boolean call(House house) {return "竹園新村".equals(house.communityName);}}).subscribe(new Action1<House>() {@Overridepublic void call(House house) {System.out.println("小區:" + house.communityName + "; 房源描述:" + house.desc);}});

程序輸出:

小區:竹園新村; 房源描述:滿五唯一,黃金地段

Last

last()只發射觀測序列中的最后一個數據項。

獲取房源列表中的最后一套房源:

Observable.from(houses).last().subscribe(new Action1<House>() {@Overridepublic void call(House house) {System.out.println("小區:" + house.communityName + "; 房源描述:" + house.desc);}});

程序輸出:

小區:中糧·海景壹號; 房源描述:南北通透,豪華五房

last(Func1)只發射觀測序列中符合條件的最后一個數據項。

獲取房源列表houses中小區名為竹園新村的最后一套房源:

Observable.from(houses).last(new Func1<House, Boolean>() {@Overridepublic Boolean call(House house) {return "竹園新村".equals(house.communityName);}}).subscribe(new Action1<House>() {@Overridepublic void call(House house) {System.out.println("小區:" + house.communityName + "; 房源描述:" + house.desc);}});

程序輸出:

小區:竹園新村; 房源描述:頂層戶型,兩室一廳

這一章我們就先聊到這,更多的過濾類操作符的介紹大家可以去查閱官方文檔和源碼;在下一章我們將繼續介紹組合類操作符。

如果大家喜歡這一系列的文章,歡迎關注我的知乎專欄和GitHub。

  • 知乎專欄:https://zhuanlan.zhihu.com/baron

  • GitHub:https://github.com/BaronZ88

總結

以上是生活随笔為你收集整理的RxJava系列四(过滤操作符)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。