RxJava學(xué)習(xí)(一)Map,FlatMap,ConcatMap,Buffer操作符

1.Map操作符
作用:將被觀察者發(fā)送的事件轉(zhuǎn)換為任意類型的事件
例子:數(shù)據(jù)類型的轉(zhuǎn)換

/**
     * map 操作符
     * 事件轉(zhuǎn)換
     * 將被觀察者發(fā)送的事件轉(zhuǎn)換為任意的類型事件暖途。
     * 例子:數(shù)據(jù)類型轉(zhuǎn)換
     */
    private void map() {
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(111);
            }
            //使用map操作符進(jìn)行事件轉(zhuǎn)換
        }).map(new Function<Integer, String>() {
            @Override
            public String apply(Integer integer) throws Exception {
                return String.valueOf(integer) + "你好";
            }
            //被觀察者訂閱事件
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.e(TAG, "轉(zhuǎn)換結(jié)果: " + s);
            }
        });
    }

輸出結(jié)果:

image.png

2.FlatMap操作符
作用:將被觀察者發(fā)送的多個(gè)事件進(jìn)行拆分,分別轉(zhuǎn)換為不同的事件
,然后合并成新的事件
例子:將每個(gè)Integer數(shù)據(jù)分別轉(zhuǎn)換成一個(gè)List贺辰,然后再迭代

/**
     *FlatMap 操作符
     * 將被觀察者的事件順序拆分
     *
     * 單獨(dú)轉(zhuǎn)換
     *  在合并成新的事件
     *
     */
    private void flatMap(){
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                Log.e(TAG, "----- " );

            }
        }).flatMap(new Function<Integer, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(Integer integer) throws Exception {
                List<String> list = new ArrayList<>();
                //分別對(duì)被觀察者的事件進(jìn)行加工轉(zhuǎn)換i
                for (int i = 0; i <2 ; i++) {
                    list.add("我是事件"+integer+"拆分后的子事件為"+i);
                }
                Log.e(TAG, "---------");
                //拆分后合并
                //
                return Observable.fromIterable(list);
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.e(TAG, "accept: "+s );
            }
        });

    }

輸出結(jié)果:


image.png

3.ConcatMap操作符
和FlatMap操作符原理一樣棚品,區(qū)別在于 FlatMap把事件拆分再合并的時(shí)候秧廉,順序可能和被觀察者發(fā)送的事件順序不一樣,而ConcatMap操作符處理后的事件順序和被觀察者發(fā)送事件的順序是一樣的。

 /**
     * 類似FlatMap()操作符
     * 但是新事件循序還是和觀察者的順序一樣
     */
    private void concatMap(){
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onNext(4);
                e.onNext(5);
                e.onNext(6);
                Log.e(TAG, "----- " );
            }
        }).concatMap(new Function<Integer, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(Integer integer) throws Exception {
                List<String> list = new ArrayList<>();
                for (int i = 0; i <2 ; i++) {
                    list.add("我是事件"+integer+"拆分后的子事件為"+i);
                }
                Log.e(TAG, "----- " );
                return Observable.fromIterable(list);
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.e(TAG, "accept: "+s );
            }
        });
    }

輸出結(jié)果:


image.png

4.Buffer操作符
把被觀察者的事件進(jìn)行緩存,然后每次從緩存中拿出一定數(shù)量事件發(fā)送給觀察者弛房。

  /**
     * buffer 操作符
     * 定期從 被觀察者(Obervable)需要發(fā)送的事件中
     * 獲取一定數(shù)量的事件 & 放到緩存區(qū)中狸臣,最終發(fā)送
     * 緩存被觀察者的發(fā)送事件
     *
     */
    private void buffer(){
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onNext(4);
            }
        }).buffer(2,1)//參數(shù)1:每次發(fā)送給觀察者事件的數(shù)量懂拾。參數(shù)2:每次從緩存中取出事件的數(shù)量
        .subscribe(new Consumer<List<Integer>>() {
            @Override
            public void accept(List<Integer> i) throws Exception {
                for (int j = 0; j <i.size() ; j++) {
                    Log.e(TAG, "accept: "+i.get(j) );
                }
            }
        });
    }

輸出結(jié)果


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市祈争,隨后出現(xiàn)的幾起案子沮峡,更是在濱河造成了極大的恐慌疟游,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隘击,死亡現(xiàn)場(chǎng)離奇詭異留量,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門楼熄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)忆绰,“玉大人,你說(shuō)我怎么就攤上這事可岂〈砀遥” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵缕粹,是天一觀的道長(zhǎng)稚茅。 經(jīng)常有香客問(wèn)我,道長(zhǎng)平斩,這世上最難降的妖魔是什么亚享? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮绘面,結(jié)果婚禮上欺税,老公的妹妹穿的比我還像新娘。我一直安慰自己揭璃,他們只是感情好晚凿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘦馍,像睡著了一般晃虫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扣墩,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音扛吞,去河邊找鬼呻惕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滥比,可吹牛的內(nèi)容都是我干的亚脆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盲泛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼濒持!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起寺滚,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柑营,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后村视,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體官套,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奶赔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惋嚎。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖站刑,靈堂內(nèi)的尸體忽然破棺而出另伍,到底是詐尸還是另有隱情,我是刑警寧澤绞旅,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布摆尝,位于F島的核電站,受9級(jí)特大地震影響玻靡,放射性物質(zhì)發(fā)生泄漏结榄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一囤捻、第九天 我趴在偏房一處隱蔽的房頂上張望臼朗。 院中可真熱鬧,春花似錦蝎土、人聲如沸视哑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)挡毅。三九已至,卻和暖如春暴构,著一層夾襖步出監(jiān)牢的瞬間跪呈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工取逾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耗绿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓砾隅,卻偏偏與公主長(zhǎng)得像误阻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晴埂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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

  • 一究反、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡(jiǎn)潔易...
    測(cè)天測(cè)地測(cè)空氣閱讀 636評(píng)論 0 1
  • 一儒洛、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性精耐,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡(jiǎn)潔易...
    BrotherChen閱讀 1,615評(píng)論 0 10
  • 前言 通過(guò)上篇的實(shí)例,相信你對(duì)RxJava的用處肯定有個(gè)基本的了解了琅锻。如果還沒(méi)看過(guò)黍氮,我強(qiáng)烈建議你先去看上篇唐含,先對(duì)整...
    luoqiang108閱讀 477評(píng)論 0 3
  • 一、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性沫浆,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡(jiǎn)潔易...
    無(wú)求_95dd閱讀 3,086評(píng)論 0 21
  • RxJava 博大精深捷枯,想要入門和進(jìn)階,操作符是一個(gè)切入點(diǎn)专执。 所以淮捆,我們希望尋找一種可以把操作符寫得比較爽,同時(shí)可...
    geniusmart閱讀 6,379評(píng)論 3 32