成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

RxJava系列四(過(guò)濾操作符)

Ryan_Li / 1217人閱讀

摘要:過(guò)濾類(lèi)操作符主要包含等等。獲取房源列表中的最后一套房源小區(qū)房源描述程序輸出小區(qū)中糧海景壹號(hào)房源描述南北通透,豪華五房只發(fā)射觀測(cè)序列中符合條件的最后一個(gè)數(shù)據(jù)項(xiàng)。

轉(zhuǎn)載請(qǐng)注明出處:https://zhuanlan.zhihu.com/p/21966621

RxJava系列1(簡(jiǎn)介)

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

RxJava系列3(轉(zhuǎn)換操作符)

RxJava系列4(過(guò)濾操作符)

RxJava系列5(組合操作符)

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

RxJava系列7(最佳實(shí)踐)

前面一篇文章中我們介紹了轉(zhuǎn)換類(lèi)操作符,那么這一章我們就來(lái)介紹下過(guò)濾類(lèi)的操作符。顧名思義,這類(lèi)operators主要用于對(duì)事件數(shù)據(jù)的篩選過(guò)濾,只返回滿(mǎn)足我們條件的數(shù)據(jù)。過(guò)濾類(lèi)操作符主要包含: Filter Take TakeLast TakeUntil Skip SkipLast ElementAt Debounce Distinct DistinctUntilChanged First Last等等。

Filter

filter(Func1)用來(lái)過(guò)濾觀測(cè)序列中我們不想要的值,只返回滿(mǎn)足條件的值,我們看下原理圖:

還是拿前面文章中的小區(qū)Community[] communities來(lái)舉例,假設(shè)我需要賽選出所有房源數(shù)大于10個(gè)的小區(qū),我們可以這樣實(shí)現(xiàn):

Observable.from(communities)
        .filter(new Func1() {
            @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

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

現(xiàn)在我們需要取小區(qū)列表communities中的前10個(gè)小區(qū)

Observable.from(communities)
        .take(10)
        .subscribe(new Action1() {
            @Override
            public void call(Community community) {
                System.out.println(community.name);
            }
        });
TakeLast

takeLast(int)同樣用一個(gè)整數(shù)n作為參數(shù),只不過(guò)它發(fā)射的是觀測(cè)序列中后n個(gè)元素。

獲取小區(qū)列表communities中的后3個(gè)小區(qū)

Observable.from(communities)
        .takeLast(3)
        .subscribe(new Action1() {
            @Override
            public void call(Community community) {
                System.out.println(community.name);
            }
        });
TakeUntil

takeUntil(Observable)訂閱并開(kāi)始發(fā)射原始Observable,同時(shí)監(jiān)視我們提供的第二個(gè)Observable。如果第二個(gè)Observable發(fā)射了一項(xiàng)數(shù)據(jù)或者發(fā)射了一個(gè)終止通知,takeUntil()返回的Observable會(huì)停止發(fā)射原始Observable并終止。

Observable observableA = 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)通過(guò)Func1中的call方法來(lái)判斷是否需要終止發(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
5
Skip

skip(int)讓我們可以忽略O(shè)bservable發(fā)射的前n項(xiàng)數(shù)據(jù)。

過(guò)濾掉小區(qū)列表communities中的前5個(gè)小區(qū)

Observable.from(communities)
        .skip(5)
        .subscribe(new Action1() {
            @Override
            public void call(Community community) {
                System.out.println(community.name);
            }
        });
SkipLast

skipLast(int)忽略O(shè)bservable發(fā)射的后n項(xiàng)數(shù)據(jù)。

ElementAt

elementAt(int)用來(lái)獲取元素Observable發(fā)射的事件序列中的第n項(xiàng)數(shù)據(jù),并當(dāng)做唯一的數(shù)據(jù)發(fā)射出去。

Debounce

debounce(long, TimeUnit)過(guò)濾掉了由Observable發(fā)射的速率過(guò)快的數(shù)據(jù);如果在一個(gè)指定的時(shí)間間隔過(guò)去了仍舊沒(méi)有發(fā)射一個(gè),那么它將發(fā)射最后的那個(gè)。通常我們用來(lái)結(jié)合RxBing(Jake Wharton大神使用RxJava封裝的Android UI組件)使用,防止button重復(fù)點(diǎn)擊。

debounce(Func1)可以根據(jù)Func1的call方法中的函數(shù)來(lái)過(guò)濾,F(xiàn)unc1中的中的call方法返回了一個(gè)臨時(shí)的Observable,如果原始的Observable在發(fā)射一個(gè)新的數(shù)據(jù)時(shí),上一個(gè)數(shù)據(jù)根據(jù)Func1的call方法生成的臨時(shí)Observable還沒(méi)結(jié)束,那么上一個(gè)數(shù)據(jù)就會(huì)被過(guò)濾掉。

Distinct

distinct()的過(guò)濾規(guī)則是只允許還沒(méi)有發(fā)射過(guò)的數(shù)據(jù)通過(guò),所有重復(fù)的數(shù)據(jù)項(xiàng)都只會(huì)發(fā)射一次。

過(guò)濾掉一段數(shù)字中的重復(fù)項(xiàng):

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方法會(huì)根據(jù)Observable發(fā)射的值生成一個(gè)Key,然后比較這個(gè)key來(lái)判斷兩個(gè)數(shù)據(jù)是不是相同;如果判定為重復(fù)則會(huì)和distinct()一樣過(guò)濾掉重復(fù)的數(shù)據(jù)項(xiàng)。

假設(shè)我們要過(guò)濾掉一堆房源中小區(qū)名重復(fù)的小區(qū):

List houses = new ArrayList<>();
//House構(gòu)造函數(shù)中的第一個(gè)參數(shù)為該房源所屬小區(qū)名,第二個(gè)參數(shù)為房源描述
List houses = new ArrayList<>();
houses.add(new House("中糧·海景壹號(hào)", "中糧海景壹號(hào)新出大平層!總價(jià)4500W起"));
houses.add(new House("竹園新村", "滿(mǎn)五唯一,黃金地段"));
houses.add(new House("竹園新村", "一樓自帶小花園"));
houses.add(new House("中糧·海景壹號(hào)", "毗鄰湯臣一品"));
houses.add(new House("中糧·海景壹號(hào)", "頂級(jí)住宅,給您總統(tǒng)般尊貴體驗(yàn)"));
houses.add(new House("竹園新村", "頂層戶(hù)型,兩室一廳"));
houses.add(new House("中糧·海景壹號(hào)", "南北通透,豪華五房"));
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ū):中糧·海景壹號(hào); 房源描述:中糧海景壹號(hào)新出大平層!總價(jià)4500W起
小區(qū):竹園新村; 房源描述:滿(mǎn)五唯一,黃金地段
DistinctUntilChanged

distinctUntilChanged()distinct()類(lèi)似,只不過(guò)它判定的是Observable發(fā)射的當(dāng)前數(shù)據(jù)項(xiàng)和前一個(gè)數(shù)據(jù)項(xiàng)是否相同。

同樣還是上面過(guò)濾數(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)生一個(gè)Key來(lái)判斷兩個(gè)相鄰的數(shù)據(jù)項(xiàng)是否相同。

我們還是拿前面的過(guò)濾房源的例子:

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ū):中糧·海景壹號(hào); 房源描述:中糧海景壹號(hào)新出大平層!總價(jià)4500W起
小區(qū):竹園新村; 房源描述:滿(mǎn)五唯一,黃金地段
小區(qū):中糧·海景壹號(hào); 房源描述:毗鄰湯臣一品
小區(qū):竹園新村; 房源描述:頂層戶(hù)型,兩室一廳
小區(qū):中糧·海景壹號(hào); 房源描述:南北通透,豪華五房
First

first()顧名思義,它是的Observable只發(fā)送觀測(cè)序列中的第一個(gè)數(shù)據(jù)項(xiàng)。

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

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

程序輸出:

小區(qū):中糧·海景壹號(hào); 房源描述:中糧海景壹號(hào)新出大平層!總價(jià)4500W起

first(Func1)只發(fā)送符合條件的第一個(gè)數(shù)據(jù)項(xiàng)。

現(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ū):竹園新村; 房源描述:滿(mǎn)五唯一,黃金地段
Last

last()只發(fā)射觀測(cè)序列中的最后一個(gè)數(shù)據(jù)項(xiàng)。

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

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

程序輸出:

小區(qū):中糧·海景壹號(hào); 房源描述:南北通透,豪華五房

last(Func1)只發(fā)射觀測(cè)序列中符合條件的最后一個(gè)數(shù)據(jù)項(xiàng)。

獲取房源列表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ū):竹園新村; 房源描述:頂層戶(hù)型,兩室一廳

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

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

知乎專(zhuān)欄:https://zhuanlan.zhihu.com/baron

GitHub:https://github.com/BaronZ88

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66505.html

相關(guān)文章

  • Java進(jìn)階之路 - 收藏集 - 掘金

    摘要:請(qǐng)欣賞語(yǔ)法清單后端掘金語(yǔ)法清單翻譯自的,從屬于筆者的入門(mén)與實(shí)踐系列。這篇一篇框架整合友好的文章三后端掘金一理論它始終是圍繞數(shù)據(jù)模型頁(yè)面進(jìn)行開(kāi)發(fā)的。 RxJava 常用操作符 - Android - 掘金 原文地址 http://reactivex.io/documenta... ... RxJava 和 Retrofit 結(jié)合使用完成基本的登錄和注冊(cè)功能 - Android - 掘...

    BakerJ 評(píng)論0 收藏0
  • Java進(jìn)階之路

    摘要:探索專(zhuān)為而設(shè)計(jì)的將探討進(jìn)行了何種改進(jìn),以及這些改進(jìn)背后的原因。關(guān)于最友好的文章進(jìn)階前言之前就寫(xiě)過(guò)一篇關(guān)于最友好的文章反響很不錯(cuò),由于那篇文章的定位就是簡(jiǎn)單友好,因此盡可能的摒棄復(fù)雜的概念,只抓住關(guān)鍵的東西來(lái)講,以保證大家都能看懂。 周月切換日歷 一個(gè)可以進(jìn)行周月切換的日歷,左右滑動(dòng)的切換月份,上下滑動(dòng)可以進(jìn)行周,月不同的視圖切換,可以進(jìn)行事件的標(biāo)記,以及節(jié)假日的顯示,功能豐富 Andr...

    sushi 評(píng)論0 收藏0
  • RxJava系列七(最佳實(shí)踐)

    摘要:按照計(jì)劃這一期是要介紹框架結(jié)構(gòu)和設(shè)計(jì)思想的,但是考慮到將在十月底發(fā)布正式版因此決定將框架結(jié)構(gòu)和設(shè)計(jì)思想分析放到正式版發(fā)布后再做。后續(xù)我也會(huì)有一系列的文章來(lái)介紹和的區(qū)別。首選我們需要調(diào)用系統(tǒng)來(lái)獲取所有已安裝的,所以在的方法中調(diào)用。 轉(zhuǎn)載請(qǐng)注明出處:[https://zhuanlan.zhihu.com/p/... RxJava系列1(簡(jiǎn)介) RxJava系列2(基本概念及使用介紹) R...

    Carson 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<