Rxjava2入門(mén)教程三:Operators操作符

如需下載源碼,請(qǐng)?jiān)L問(wèn)
https://github.com/fengchuanfang/Rxjava2Tutorial
文章原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:
Rxjava2入門(mén)教程三:Operators操作符


Operators操作符

操作符(Operators):其實(shí)質(zhì)是函數(shù)式編程中的高階函數(shù),是對(duì)響應(yīng)式編程的各個(gè)過(guò)程拆分封裝后的產(chǎn)物。以便于我們操作數(shù)據(jù)流。
按照其作用具體可分為以下幾類:
創(chuàng)建:創(chuàng)建一個(gè)可觀察對(duì)象Observable并發(fā)射數(shù)據(jù)
過(guò)濾:從Observable發(fā)射的數(shù)據(jù)中取出特定的值
變換:對(duì)Observable發(fā)射的數(shù)據(jù)執(zhí)行變換操作
組合:組合多個(gè)Observable,例如:{1,2,3}+{4,5,6}-->{1,2,3,4,5,6}
聚合:聚合多個(gè)Observable,例如:{1,2,3}+{4,5,6}-->{[1,4],[2,5],[3,6]}
下面對(duì)一些常用的操作符做一下介紹(后面的章節(jié)中,會(huì)做全面匯總)

創(chuàng)建操作:

create:基礎(chǔ)創(chuàng)建操作符
just:創(chuàng)建一個(gè)Observable,可接受一個(gè)或多個(gè)參數(shù),將每個(gè)參數(shù)逐一發(fā)送

Observable.just("hello world");//發(fā)送一個(gè)字符串"hello world"
Observable.just(1,2,3,4);//逐一發(fā)送1,2,3,4這四個(gè)整數(shù)

fromArray:創(chuàng)建一個(gè)Observable,接受一個(gè)數(shù)組,并將數(shù)組中的數(shù)據(jù)逐一發(fā)送
fromIterable:</b>創(chuàng)建一個(gè)Observable,接受一個(gè)可迭代對(duì)象,并將可迭代對(duì)象中的數(shù)據(jù)逐一發(fā)送
range:</b>創(chuàng)建一個(gè)Observable,發(fā)送一個(gè)范圍內(nèi)的整數(shù)序列

Observable.range(1,10);//從1開(kāi)始以步長(zhǎng)1遞增發(fā)送10個(gè)數(shù)據(jù)
運(yùn)行如下代碼:

demo1_range.jpg

控制臺(tái)打?。?/p>

  0
  1
  2
  3
  4

過(guò)濾操作(filter與distinct):

filter:filter使用Predicate 函數(shù)接口傳入條件值,來(lái)判斷Observable發(fā)射的每一個(gè)值是否滿足這個(gè)條件,如果滿足,則繼續(xù)向下傳遞,如果不滿足,則過(guò)濾掉。
如下圖:

05F271FEB0494D3C85FA622419DD943A.jpg

運(yùn)行如下代碼:

demo2_filter.jpg

通過(guò)rang操作符發(fā)射整數(shù)序列0~10;然后通過(guò)filter過(guò)濾能被3整除的數(shù),控制臺(tái)打印如下;

    0
    3
    6
    9

distinct:過(guò)濾掉重復(fù)的數(shù)據(jù)項(xiàng),過(guò)濾規(guī)則為:只允許還沒(méi)有發(fā)射過(guò)的數(shù)據(jù)項(xiàng)通過(guò)。
如下圖:

2DFB371B1F314B90B8E7A55966B1EC5D.jpg

運(yùn)行如下代碼:

demo3_distinct.jpg

通過(guò)just操作符,發(fā)射數(shù)據(jù)序列{1,1,2,3,1,2,2,4,5};然后通過(guò)distinct過(guò)濾去重,運(yùn)行結(jié)果如下:

    1
    2
    3
    4
    5
鏈接使用

所有的操作符均可以鏈接配合使用,共同對(duì)結(jié)果起作用
先對(duì)數(shù)據(jù)序列去重{1,1,2,3,1,2,2,4,5},然后在篩選出偶數(shù)

demo4_distinct_filter.jpg

運(yùn)行結(jié)果如下;

    2
    4

變換操作(map與flatMap)

map:對(duì)Observable發(fā)射的每一項(xiàng)數(shù)據(jù)應(yīng)用一個(gè)函數(shù),執(zhí)行變換操作
map操作符,需要接收一個(gè)函數(shù)接口Function<T,R>的實(shí)例化對(duì)象,實(shí)現(xiàn)接口內(nèi)R apply(T t)的方法,在此方法中可以對(duì)接收到的數(shù)據(jù)t進(jìn)行變換后返回。
如下圖:

0449AFF58A654A8282737BE31F3226E7.jpg

運(yùn)行如下代碼:

demo5_map.jpg

在方法apply中,對(duì)Observable發(fā)射過(guò)來(lái)的數(shù)字integer執(zhí)行了以下變換integer+"^2 = "+integer*intege后返回。
運(yùn)行結(jié)果如下:

    0^2 = 0
    1^2 = 1
    2^2 = 4
    3^2 = 9
    4^2 = 16

flatMap:將一個(gè)發(fā)射數(shù)據(jù)的Observable變換為多個(gè)Observable,然后將多個(gè)Observable發(fā)射的數(shù)據(jù)合并到一個(gè)Observable中進(jìn)行發(fā)射
如下圖:

BD6A82E54E6648BB8A3FD66AFA19EDBF.jpg

運(yùn)行如下代碼:

demo6_flatMap.jpg

首先,用just操作符,發(fā)射三個(gè)數(shù)組,通過(guò)flatMap變換,將每個(gè)數(shù)組中的元素用操作符fromArray取出后逐一發(fā)射
最后觀察者接收數(shù)據(jù)如下;

    1
    2
    3
    4
    5
    6
    7
    8
    9

組合操作(mergeWith與concatWith)

mergeWith:合并多個(gè)Observable發(fā)射的數(shù)據(jù),可能會(huì)讓Observable發(fā)射的數(shù)據(jù)交錯(cuò)。
如下圖:

D81F3936DC1E46DFB6E375C2B14B0DF5.jpg

運(yùn)行如下代碼:

demo7_mergeWith.jpg

一個(gè)Observable用just發(fā)送數(shù)據(jù)序列1,2,3,4,5,另一個(gè)Observable用fromArray逐一發(fā)送數(shù)組中的數(shù)據(jù)5,6,7,8,9,然后用mergeWith將兩者組合,運(yùn)行如下

    1
    2
    3
    4
    5
    5
    6
    7
    8
    9

concatWith:同mergeWith一樣,用以合并多個(gè)Observable發(fā)射的數(shù)據(jù),但是concatWith不會(huì)讓Observable發(fā)射的數(shù)據(jù)交錯(cuò)。
如下圖:

concatWith.jpg

運(yùn)行如下代碼:

demo8_concatWith.jpg

一個(gè)Observable用just發(fā)送數(shù)據(jù)序列1.2.3.4,5,另一個(gè)Observable用fromArray逐一發(fā)送數(shù)組中的數(shù)據(jù)5,6,7,8,9,然后用concatWith將兩者組合,運(yùn)行如下

      1
      2
      3
      4
      5
      5
      6
      7
      8
      9

聚合操作(zipWith)

zipWith:將多個(gè)Obversable發(fā)射的數(shù)據(jù),通過(guò)一個(gè)函數(shù)BiFunction對(duì)對(duì)應(yīng)位置的數(shù)據(jù)處理后放到一個(gè)新的Observable中發(fā)射,所發(fā)射的數(shù)據(jù)個(gè)數(shù)與最少的Observabel中的一樣多。
定義一個(gè)函數(shù):

344FA00396BB4C5EA85D004F9ADEDAC0.jpg

聚合如下:

CDA3BBC425CE4097B4BE45B923E526B1.jpg

代碼如下:

demo9_zipWith.jpg

zipWith需要接收兩個(gè)參數(shù),
一個(gè)是可觀察對(duì)象,
另一個(gè)是聚合函數(shù)接口BiFunction,這個(gè)接口有三個(gè)泛型,分別為第一個(gè)可觀察對(duì)象發(fā)射的數(shù)據(jù)類型,第二個(gè)可觀察對(duì)象發(fā)射的數(shù)據(jù)類型,經(jīng)過(guò)聚合函數(shù)apply處理后返回的數(shù)據(jù)類型

代碼運(yùn)行結(jié)果為;

    1紅娃
    2橙娃
    3黃娃
    4綠娃
    5青娃
    6藍(lán)娃
    7紫娃

以上的操作符均可以鏈接使用,下面的代碼鏈接了本節(jié)中的所有操作符

demo10_link_all_operators.jpg

運(yùn)行結(jié)果如下;

    3:紅娃
    4:橙娃
    1:黃娃
    2:綠娃

上一篇:Rxjava2入門(mén)教程二:Observable與Observer響應(yīng)式編程在Rxjava2中的典型實(shí)現(xiàn)
下一篇:Rxjava2入門(mén)教程四:Scheduler線程調(diào)度器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容