如需下載源碼,請(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)行如下代碼:

控制臺(tái)打?。?/p>
0
1
2
3
4
過(guò)濾操作(filter與distinct):
filter:filter使用Predicate 函數(shù)接口傳入條件值,來(lái)判斷Observable發(fā)射的每一個(gè)值是否滿足這個(gè)條件,如果滿足,則繼續(xù)向下傳遞,如果不滿足,則過(guò)濾掉。
如下圖:

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

通過(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ò)。
如下圖:

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

通過(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ù)

運(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)行變換后返回。
如下圖:

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

在方法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ā)射
如下圖:

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

首先,用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ò)。
如下圖:

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

一個(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ò)。
如下圖:

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

一個(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ù):

聚合如下:

代碼如下:

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é)中的所有操作符

運(yùn)行結(jié)果如下;
3:紅娃
4:橙娃
1:黃娃
2:綠娃
上一篇:Rxjava2入門(mén)教程二:Observable與Observer響應(yīng)式編程在Rxjava2中的典型實(shí)現(xiàn)
下一篇:Rxjava2入門(mén)教程四:Scheduler線程調(diào)度器