成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

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

xuxueli / 2762人閱讀

摘要:從這一章開(kāi)始,我們開(kāi)始聊聊中的操作符,后面我將用三章的篇幅來(lái)分別介紹轉(zhuǎn)換類(lèi)操作符過(guò)濾類(lèi)操作符組合類(lèi)操作符這一章我們主要講講轉(zhuǎn)換類(lèi)操作符。函數(shù)同樣也是做轉(zhuǎn)換的,但是作用卻不一樣。

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

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

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

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

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

RxJava系列5(組合操作符)

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

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

前面兩篇文章中我們介紹了RxJava的一些基本概念和RxJava最簡(jiǎn)單的用法。從這一章開(kāi)始,我們開(kāi)始聊聊RxJava中的操作符Operators,后面我將用三章的篇幅來(lái)分別介紹:

轉(zhuǎn)換類(lèi)操作符

過(guò)濾類(lèi)操作符

組合類(lèi)操作符

這一章我們主要講講轉(zhuǎn)換類(lèi)操作符。所有這些Operators都作用于一個(gè)可觀測(cè)序列,然后變換它發(fā)射的值,最后用一種新的形式返回它們。概念實(shí)在是不好理解,下面我們結(jié)合實(shí)際的例子一一介紹。

Map

map(Func1)函數(shù)接受一個(gè)Func1類(lèi)型的參數(shù)(就像這樣map(Func1 func)),然后吧這個(gè)Func1應(yīng)用到每一個(gè)由Observable發(fā)射的值上,將發(fā)射的只轉(zhuǎn)換為我們期望的值。這種狗屁定義我相信你也聽(tīng)不懂,我們來(lái)看一下官方給出的原理圖:

假設(shè)我們需要將一組數(shù)字裝換成字符串,我們可以通過(guò)map這樣實(shí)現(xiàn):

Observable.just(1, 2, 3, 4, 5)
        .map(new Func1() {

            @Override
            public String call(Integer i) {
                return "This is " + i;
            }
        }).subscribe(new Action1() {
            @Override
            public void call(String s) {
                System.out.println(s);
            }
        });

Func1構(gòu)造函數(shù)中的兩個(gè)參數(shù)分別是Observable發(fā)射值當(dāng)前的類(lèi)型和map轉(zhuǎn)換后的類(lèi)型,上面這個(gè)例子中發(fā)射值當(dāng)前的類(lèi)型是Integer,轉(zhuǎn)換后的類(lèi)型是String。

FlatMap

flatMap(Func1)函數(shù)同樣也是做轉(zhuǎn)換的,但是作用卻不一樣。flatMap不太好理解,我們直接看例子(我們公司是個(gè)房產(chǎn)平臺(tái),那我就拿房子舉例):假設(shè)我們有一組小區(qū)數(shù)據(jù)Community[] communites,現(xiàn)在我們要輸出每個(gè)小區(qū)的名字;我們可以這樣實(shí)現(xiàn):

Observable.from(communities)
        .map(new Func1() {

            @Override
            public String call(Community community) {
                return community.name;
            }
        })
        .subscribe(new Action1() {
            @Override
            public void call(String name) {
                System.out.println("Community name : " + name);
            }
        });

現(xiàn)在我們需求有變化,需要打印出每個(gè)小區(qū)下面每一套房子的價(jià)格。于是我可以這樣實(shí)現(xiàn):

Community[] communities = {};
Observable.from(communities)
        .subscribe(new Action1() {
            @Override
            public void call(Community community) {
                for (House house : community.houses) {
                    System.out.println("House price : " + house.price);
                }
            }
        });

如果我不想在Subscriber中使用for循環(huán),而是希望Subscriber中直接傳入單個(gè)的House對(duì)象呢?用map()顯然是不行的,因?yàn)閙ap()是一對(duì)一的轉(zhuǎn)化,而我現(xiàn)在的要求是一對(duì)多的轉(zhuǎn)化。那么我們可以使用flatMap()把一個(gè)Community轉(zhuǎn)化成多個(gè)House。

Observable.from(communities)
        .flatMap(new Func1>() {
            @Override
            public Observable call(Community community) {
                return Observable.from(community.houses);
            }
        })
        .subscribe(new Action1() {
            @Override
            public void call(House house) {
                System.out.println("House price : " + house.price);
            }
        });

從前面的例子中我們發(fā)現(xiàn),flatMap()和map()都是把傳入的參數(shù)轉(zhuǎn)化之后返回另一個(gè)對(duì)象。但和map()不同的是,flatMap()中返回的是Observable對(duì)象,并且這個(gè)Observable對(duì)象并不是被直接發(fā)送到 Subscriber的回調(diào)方法中。

flatMap(Func1)的原理是這樣的:

將傳入的事件對(duì)象裝換成一個(gè)Observable對(duì)象;

這是不會(huì)直接發(fā)送這個(gè)Observable, 而是將這個(gè)Observable激活讓它自己開(kāi)始發(fā)送事件;

每一個(gè)創(chuàng)建出來(lái)的Observable發(fā)送的事件,都被匯入同一個(gè)Observable,這個(gè)Observable負(fù)責(zé)將這些事件統(tǒng)一交給Subscriber的回調(diào)方法。

這三個(gè)步驟,把事件拆成了兩級(jí),通過(guò)一組新創(chuàng)建的Observable將初始的對(duì)象『鋪平』之后通過(guò)統(tǒng)一路徑分發(fā)了下去。而這個(gè)『鋪平』就是flatMap()所謂的flat。

最后我們來(lái)看看flatMap的原理圖:

ConcatMap

concatMap(Func1)解決了flatMap()的交叉問(wèn)題,它能夠把發(fā)射的值連續(xù)在一起,就像這樣:

flatMapIterable

flatMapIterable(Func1)flatMap()幾乎是一樣的,不同的是flatMapIterable()它轉(zhuǎn)化的多個(gè)Observable是使用Iterable作為源數(shù)據(jù)的。

Observable.from(communities)
        .flatMapIterable(new Func1>() {
            @Override
            public Iterable call(Community community) {
                return community.houses;
            }
        })
        .subscribe(new Action1() {

            @Override
            public void call(House house) {

            }
        });
SwitchMap

switchMap(Func1)flatMap(Func1)很像,除了一點(diǎn):每當(dāng)源Observable發(fā)射一個(gè)新的數(shù)據(jù)項(xiàng)(Observable)時(shí),它將取消訂閱并停止監(jiān)視之前那個(gè)數(shù)據(jù)項(xiàng)產(chǎn)生的Observable,并開(kāi)始監(jiān)視當(dāng)前發(fā)射的這一個(gè)。

Scan

scan(Func2)對(duì)一個(gè)序列的數(shù)據(jù)應(yīng)用一個(gè)函數(shù),并將這個(gè)函數(shù)的結(jié)果發(fā)射出去作為下個(gè)數(shù)據(jù)應(yīng)用合格函數(shù)時(shí)的第一個(gè)參數(shù)使用。

我們來(lái)看個(gè)簡(jiǎn)單的例子:

Observable.just(1, 2, 3, 4, 5)
        .scan(new Func2() {
            @Override
            public Integer call(Integer integer, Integer integer2) {
                return integer + integer2;
            }
        }).subscribe(new Action1() {
    @Override
    public void call(Integer integer) {
        System.out.print(integer+“ ”);
    }
});

輸出結(jié)果為:

1 3 6 10 15  
GroupBy

groupBy(Func1)將原始Observable發(fā)射的數(shù)據(jù)按照key來(lái)拆分成一些小的Observable,然后這些小Observable分別發(fā)射其所包含的的數(shù)據(jù),和SQL中的groupBy類(lèi)似。實(shí)際使用中,我們需要提供一個(gè)生成key的規(guī)則(也就是Func1中的call方法),所有key相同的數(shù)據(jù)會(huì)包含在同一個(gè)小的Observable中。另外我們還可以提供一個(gè)函數(shù)來(lái)對(duì)這些數(shù)據(jù)進(jìn)行轉(zhuǎn)化,有點(diǎn)類(lèi)似于集成了flatMap。

單純的文字描述和圖片解釋可能難以理解,我們來(lái)看個(gè)例子:假設(shè)我現(xiàn)在有一組房源List houses,每套房子都屬于某一個(gè)小區(qū),現(xiàn)在我們需要根據(jù)小區(qū)名來(lái)對(duì)房源進(jìn)行分類(lèi),然后依次將房源信息輸出。

List houses = new ArrayList<>();
houses.add(new House("中糧·海景壹號(hào)", "中糧海景壹號(hào)新出大平層!總價(jià)4500W起"));
houses.add(new House("竹園新村", "滿五唯一,黃金地段"));
houses.add(new House("中糧·海景壹號(hào)", "毗鄰湯臣一品"));
houses.add(new House("竹園新村", "頂層戶(hù)型,兩室一廳"));
houses.add(new House("中糧·海景壹號(hào)", "南北通透,豪華五房"));
Observable> groupByCommunityNameObservable = Observable.from(houses)
        .groupBy(new Func1() {

            @Override
            public String call(House house) {
                return house.communityName;
            }
        });

通過(guò)上面的代碼我們創(chuàng)建了一個(gè)新的Observable:groupByCommunityNameObservable,它將會(huì)發(fā)送一個(gè)帶有GroupedObservable的序列(也就是指發(fā)送的數(shù)據(jù)項(xiàng)的類(lèi)型為GroupedObservable)。GroupedObservable是一個(gè)特殊的Observable,它基于一個(gè)分組的key,在這個(gè)例子中的key就是小區(qū)名?,F(xiàn)在我們需要將分類(lèi)后的房源依次輸出:

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

執(zhí)行結(jié)果:

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

轉(zhuǎn)換類(lèi)的操作符就先介紹到這,后續(xù)還會(huì)繼續(xù)介紹組合、過(guò)濾類(lèi)的操作符及源碼分析,敬請(qǐng)期待!

如果大家喜歡這一系列的文章,歡迎關(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://m.hztianpu.com/yun/66506.html

相關(guān)文章

  • 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
  • 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

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

0條評(píng)論

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