RxJava操作符之變換操作

Buffer

定期收集Observable的數(shù)據(jù)放進(jìn)一個(gè)數(shù)據(jù)包裹,然后發(fā)射這些數(shù)據(jù)包裹,而不是一次發(fā)射一個(gè)值。


buffer示例圖片

Buffer操作符將一個(gè)Observable變換為另一個(gè),原來的Observable正常發(fā)射數(shù)據(jù)啊掏,變換產(chǎn)生的Observable發(fā)射這些數(shù)據(jù)的緩存集合。Buffer操作符在很多語言特定的實(shí)現(xiàn)中有很多種變體衰猛,它們?cè)谌绾尉彺孢@個(gè)問題上存在區(qū)別迟蜜。

注意:如果原來的Observable發(fā)射了一個(gè)onError通知,Buffer會(huì)立即傳遞這個(gè)通知啡省,而不是首先發(fā)射緩存的數(shù)據(jù)娜睛,即使在這之前緩存中包含了原始Observable發(fā)射的數(shù)據(jù)。

Window操作符與Buffer類似卦睹,但是它在發(fā)射之前把收集到的數(shù)據(jù)放進(jìn)單獨(dú)的Observable畦戒,而不是放進(jìn)一個(gè)數(shù)據(jù)結(jié)構(gòu)。

在RxJava中有許多Buffer的變體:

buffer(count)

buffer(count)以列表(List)的形式發(fā)射非重疊的緩存结序,每一個(gè)緩存至多包含來自原始Observable的count項(xiàng)數(shù)據(jù)(最后發(fā)射的列表數(shù)據(jù)可能少于count項(xiàng))

buffer(count, skip)

buffer(count,?skip)從原始Observable的第一項(xiàng)數(shù)據(jù)開始創(chuàng)建新的緩存障斋,此后每當(dāng)收到skip項(xiàng)數(shù)據(jù),用count項(xiàng)數(shù)據(jù)填充緩存:開頭的一項(xiàng)和后續(xù)的count-1項(xiàng)徐鹤,它以列表(List)的形式發(fā)射緩存垃环,取決于countskip的值,這些緩存可能會(huì)有重疊部分(比如skip < count時(shí))返敬,也可能會(huì)有間隙(比如skip > count時(shí))

FlatMap

FlatMap將一個(gè)發(fā)射數(shù)據(jù)的Observable變換為多個(gè)Observables遂庄,然后將它們發(fā)射的數(shù)據(jù)合并后放進(jìn)一個(gè)單獨(dú)的Observable


flatMap

FlatMap操作符使用一個(gè)指定的函數(shù)對(duì)原始Observable發(fā)射的每一項(xiàng)數(shù)據(jù)執(zhí)行變換操作,這個(gè)函數(shù)返回一個(gè)本身也發(fā)射數(shù)據(jù)的Observable救赐,然后FlatMap合并這些Observables發(fā)射的數(shù)據(jù)涧团,最后將合并后的結(jié)果當(dāng)做它自己的數(shù)據(jù)序列發(fā)射只磷。

這個(gè)方法是很有用的经磅,例如泌绣,當(dāng)你有一個(gè)這樣的Observable:它發(fā)射一個(gè)數(shù)據(jù)序列,這些數(shù)據(jù)本身包含Observable成員或者可以變換為Observable预厌,因此你可以創(chuàng)建一個(gè)新的Observable發(fā)射這些次級(jí)Observable發(fā)射的數(shù)據(jù)的完整集合阿迈。

注意:FlatMap對(duì)這些Observables發(fā)射的數(shù)據(jù)做的是合并(merge)操作,因此它們可能是交錯(cuò)的轧叽。

在許多語言特定的實(shí)現(xiàn)中苗沧,還有一個(gè)操作符不會(huì)讓變換后的Observables發(fā)射的數(shù)據(jù)交錯(cuò),它按照嚴(yán)格的順序發(fā)射這些數(shù)據(jù)炭晒,這個(gè)操作符通常被叫作ConcatMap或者類似的名字待逞。

注意:如果任何一個(gè)通過這個(gè)flatMap操作產(chǎn)生的單獨(dú)的Observable調(diào)用onError異常終止了,這個(gè)Observable自身會(huì)立即調(diào)用onError并終止网严。

這個(gè)操作符有一個(gè)接受額外的int參數(shù)的一個(gè)變體识樱。這個(gè)參數(shù)設(shè)置flatMap從原來的Observable映射Observables的最大同時(shí)訂閱數(shù)。當(dāng)達(dá)到這個(gè)限制時(shí)震束,它會(huì)等待其中一個(gè)終止然后再訂閱另一個(gè)怜庸。

GroupBy

將一個(gè)Observable分拆為一些Observables集合,它們中的每一個(gè)發(fā)射原始Observable的一個(gè)子序列


groupBy示例圖片

GroupBy操作符將原始Observable分拆為一些Observables集合垢村,它們中的每一個(gè)發(fā)射原始Observable數(shù)據(jù)序列的一個(gè)子序列割疾。哪個(gè)數(shù)據(jù)項(xiàng)由哪一個(gè)Observable發(fā)射是由一個(gè)函數(shù)判定的,這個(gè)函數(shù)給每一項(xiàng)指定一個(gè)Key嘉栓,Key相同的數(shù)據(jù)會(huì)被同一個(gè)Observable發(fā)射宏榕。

RxJava實(shí)現(xiàn)了groupBy操作符。它返回Observable的一個(gè)特殊子類GroupedObservable侵佃,實(shí)現(xiàn)了GroupedObservable接口的對(duì)象有一個(gè)額外的方法getKey麻昼,這個(gè)Key用于將數(shù)據(jù)分組到指定的Observable。

有一個(gè)版本的groupBy允許你傳遞一個(gè)變換函數(shù)趣钱,這樣它可以在發(fā)射結(jié)果GroupedObservable之前改變數(shù)據(jù)項(xiàng)涌献。

注意:groupBy將原始Observable分解為一個(gè)發(fā)射多個(gè)GroupedObservable的Observable,一旦有訂閱首有,每個(gè)GroupedObservable就開始緩存數(shù)據(jù)燕垃。因此,如果你忽略這些GroupedObservable中的任何一個(gè)井联,這個(gè)緩存可能形成一個(gè)潛在的內(nèi)存泄露卜壕。因此,如果你不想觀察烙常,也不要忽略GroupedObservable轴捎。你應(yīng)該使用像take(0)這樣會(huì)丟棄自己的緩存的操作符鹤盒。

如果你取消訂閱一個(gè)GroupedObservable,那個(gè)Observable將會(huì)終止侦副。如果之后原始的Observable又發(fā)射了一個(gè)與這個(gè)Observable的Key匹配的數(shù)據(jù)侦锯,groupBy將會(huì)為這個(gè)Key創(chuàng)建一個(gè)新的GroupedObservable

groupBy默認(rèn)不在任何特定的調(diào)度器上執(zhí)行秦驯。

Map

對(duì)Observable發(fā)射的每一項(xiàng)數(shù)據(jù)應(yīng)用一個(gè)函數(shù)尺碰,執(zhí)行變換操作


map示例圖片

Map操作符對(duì)原始Observable發(fā)射的每一項(xiàng)數(shù)據(jù)應(yīng)用一個(gè)你選擇的函數(shù),然后返回一個(gè)發(fā)射這些結(jié)果的Observable译隘。

RxJava將這個(gè)操作符實(shí)現(xiàn)為map函數(shù)亲桥。這個(gè)操作符默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。

Scan

連續(xù)地對(duì)數(shù)據(jù)序列的每一項(xiàng)應(yīng)用一個(gè)函數(shù)固耘,然后連續(xù)發(fā)射結(jié)果


scan示例圖片

scan操作符對(duì)原始Observable發(fā)射的第一項(xiàng)數(shù)據(jù)應(yīng)用一個(gè)函數(shù)题篷,然后將那個(gè)函數(shù)的結(jié)果作為自己的第一項(xiàng)數(shù)據(jù)發(fā)射。它將函數(shù)的結(jié)果同第二項(xiàng)數(shù)據(jù)一起填充給這個(gè)函數(shù)來產(chǎn)生它自己的第二項(xiàng)數(shù)據(jù)厅目。它持續(xù)進(jìn)行這個(gè)過程來產(chǎn)生剩余的數(shù)據(jù)序列番枚。這個(gè)操作符在某些情況下被叫做accumulator

RxJava實(shí)現(xiàn)了scan操作符璧瞬。

示例代碼:


Observable.just(1, 2, 3, 4, 5)
    .scan(new Func2<Integer, Integer, Integer>() {
        @Override
        public Integer call(Integer sum, Integer item) {
            return sum + item;
        }
    }).subscribe(new Subscriber<Integer>() {
        @Override
        public void onNext(Integer item) {
            System.out.println("Next: " + item);
        }

        @Override
        public void onError(Throwable error) {
            System.err.println("Error: " + error.getMessage());
        }

        @Override
        public void onCompleted() {
            System.out.println("Sequence complete.");
        }
    });

輸出

Next: 1
Next: 3
Next: 6
Next: 10
Next: 15
Sequence complete.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末户辫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗤锉,更是在濱河造成了極大的恐慌渔欢,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘟忱,死亡現(xiàn)場(chǎng)離奇詭異奥额,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)访诱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門垫挨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人触菜,你說我怎么就攤上這事九榔。” “怎么了涡相?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵哲泊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我催蝗,道長(zhǎng)切威,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任丙号,我火速辦了婚禮先朦,結(jié)果婚禮上缰冤,老公的妹妹穿的比我還像新娘。我一直安慰自己喳魏,他們只是感情好棉浸,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著截酷,像睡著了一般涮拗。 火紅的嫁衣襯著肌膚如雪乾戏。 梳的紋絲不亂的頭發(fā)上迂苛,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音鼓择,去河邊找鬼三幻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呐能,可吹牛的內(nèi)容都是我干的念搬。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼摆出,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼朗徊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起偎漫,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤爷恳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后象踊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體温亲,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年杯矩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栈虚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡史隆,死狀恐怖魂务,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泌射,我是刑警寧澤粘姜,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站魄幕,受9級(jí)特大地震影響相艇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纯陨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一坛芽、第九天 我趴在偏房一處隱蔽的房頂上張望留储。 院中可真熱鬧,春花似錦咙轩、人聲如沸获讳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丐膝。三九已至,卻和暖如春钾菊,著一層夾襖步出監(jiān)牢的瞬間帅矗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來泰國(guó)打工煞烫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浑此,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓滞详,卻偏偏與公主長(zhǎng)得像凛俱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子料饥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位蒲犬,與響應(yīng)式編程作為結(jié)合使用的,對(duì)什么是操作岸啡、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,867評(píng)論 0 10
  • 前言 按照官方的分類原叮,操作符大致分為以下幾種: Creating Observables(Observable的創(chuàng)...
    小玉1991閱讀 1,052評(píng)論 0 1
  • 作者: maplejaw本篇只解析標(biāo)準(zhǔn)包中的操作符。對(duì)于擴(kuò)展包凰狞,由于使用率較低篇裁,如有需求,請(qǐng)讀者自行查閱文檔赡若。 創(chuàng)...
    maplejaw_閱讀 45,700評(píng)論 8 93
  • 創(chuàng)建操作 用于創(chuàng)建Observable的操作符Create通過調(diào)用觀察者的方法從頭創(chuàng)建一個(gè)ObservableEm...
    rkua閱讀 1,842評(píng)論 0 1
  • 注:只包含標(biāo)準(zhǔn)包中的操作符达布,用于個(gè)人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,200評(píng)論 2 8