RxJava 2.0----變換操作符Transforming Operators

一.引言

Operators 操作符是為了實(shí)現(xiàn)對(duì)被觀察者發(fā)射事件或數(shù)據(jù)的變換,用于在被觀察者Observable/Flowable和目標(biāo)觀察者Observer/Subscriber之間修改Observable發(fā)出的事件斜做。
RxJava提供了很多很有用的操作符场躯,按照功能可以主要分為一下類型:

● 創(chuàng)建操作符-- Creating Observables
● 變換操作符--Transforming Observables
過(guò)濾操作符-- Filtering Observables
合并操作符-- Combining Observables
布爾操作符-- Boolean Operators
事件流操作符--Observable Utility Operators

1.創(chuàng)建操作符 Creating Observables
用來(lái)創(chuàng)建新的Observables.主要有以下方法:
●Create
●Defer
●Empty/Never/Throw
●From
● Interval
●Just
● Range
● Repeat
● Start
● Timer
創(chuàng)建操作符在之前講Observable/Flowable的創(chuàng)建時(shí)已經(jīng)講過(guò)谈为。
2.變換操作符Transforming Observables
將上級(jí)的數(shù)據(jù)處理變換后再發(fā)射出去,主要有以下方法:
●Buffer
●FlatMap
● GroupBy
● Map
● Scan
● Window

1.Buffer

Buffer操作符定期收集Observable的數(shù)據(jù)放進(jìn)一個(gè)數(shù)據(jù)集合里踢关,然后發(fā)射這些數(shù)據(jù)集合伞鲫,而不是一次發(fā)射一個(gè)源數(shù)據(jù)的值。

 Observable.fromArray(arr)
                .buffer(3,1)
                .subscribe(getStringListObserver("buffer"));
        // 3 means,  每創(chuàng)建一個(gè)list的長(zhǎng)度 (it takes max of three from its start index and create list)
        // 1 means, 每創(chuàng)建一個(gè)list,開始下標(biāo)跳過(guò)的個(gè)數(shù)(it jumps one step every time)
        //輸出
        // a,b,c
        // b,c,d
        // c,d,e
        // d,e
        // e
        Observable.fromArray(arr)
                .buffer(2)//默認(rèn)skip 和count相同
                .subscribe(getStringListObserver("buffer"));
        //輸出
        // a,b,
        // c,d,
        // e
        ```
**2.Map**
        
將上級(jí)數(shù)據(jù)修改签舞,變換處理后秕脓,在發(fā)射到下一級(jí),變換數(shù)據(jù)是一對(duì)一的儒搭。
```java
   Observable.just(1,2,3,4,5)
                .map(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer) throws Exception {
                        return integer+".xxxxx";
                    }
                }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                print(s);
            }
        });
        //輸出結(jié)果
//        1.xxxxx
//        2.xxxxx
//        3.xxxxx
//        4.xxxxx
//        5.xxxxx

3. FlatMap
將上級(jí)數(shù)據(jù)修改撒会,變換處理后,在發(fā)射到下一級(jí)师妙,變換數(shù)據(jù)可以一對(duì)一诵肛,也可以一對(duì)多。

Observable.just(1,2,3,4,5)
                .flatMap(new Function<Integer, ObservableSource<String>>() {
                    @Override
                    public ObservableSource<String> apply(final Integer integer) throws Exception {

                        return Observable.create(new ObservableOnSubscribe<String>() {
                            @Override
                            public void subscribe(ObservableEmitter<String> e) throws Exception {
                                e.onNext(integer+".x");
                                e.onNext(integer+".xx");
                                e.onNext(integer+".xxx");
                                e.onNext(integer+".xxxx");
                                e.onComplete();
                            }
                        });
                    }
                }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                print("accept:"+s);
            }
        });
        Observable.just(1,2,3,4,5).flatMap(new Function<Integer, ObservableSource<Integer>>() {
            @Override
            public ObservableSource<Integer> apply(Integer integer) throws Exception {
                return Observable.just(integer * 2);
            }
        }, new BiFunction<Integer, Integer, Integer>() {
            @Override
            public Integer apply(Integer integer, Integer integer2) throws Exception {
                return integer + integer2;
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                print("accept:"+integer);
            }
        });
        //輸出結(jié)果
//        accept:1.x
//        accept:1.xx
//        accept:1.xxx
//        accept:1.xxxx
//        accept:2.x
//        accept:2.xx
//        accept:2.xxx
//        accept:2.xxxx
//        accept:3.x
//        accept:3.xx
//        accept:3.xxx
//        accept:3.xxxx
//        accept:4.x
//        accept:4.xx
//        accept:4.xxx
//        accept:4.xxxx
//        accept:5.x
//        accept:5.xx
//        accept:5.xxx
//        accept:5.xxxx

//        accept:3
//        accept:6
//        accept:9
//        accept:12
//        accept:15

4.GroupBy
GroupBy操作符將原始Observable發(fā)射的數(shù)據(jù)按照key來(lái)拆分成一些小的Observable默穴,然后這些小的Observable分別發(fā)射其所包含的的數(shù)據(jù)怔檩。

 String[] arr = new String[]{"aaa", "bb", "ccc", "dd", "eee"};
        Observable.fromArray(arr).groupBy(new Function<String, Boolean>() {
            @Override
            public Boolean apply(String s) throws Exception {
                return s.length()== 3;
            }
        }).subscribe(new Consumer<GroupedObservable<Boolean, String>>() {
            @Override
            public void accept(final GroupedObservable<Boolean, String> booleanStringGroupedObservable) throws Exception {
                if(booleanStringGroupedObservable.getKey()) {
                    booleanStringGroupedObservable.toList().subscribe(new Consumer<List<String>>() {
                        @Override
                        public void accept(List<String> strings) throws Exception {
                            print("key=" + booleanStringGroupedObservable.getKey() + ",val=" + strings);
                        }
                    });
                }else{
                    booleanStringGroupedObservable.subscribe(new Consumer<String>() {
                        @Override
                        public void accept(String s) throws Exception {
                            print("key=" + booleanStringGroupedObservable.getKey() + ",val=" + s+s);
                        }
                    });
                }
            }
        });
        //輸出結(jié)果
//        key=false,val=bbbb
//        key=false,val=dddd
//        key=true,val=[aaa, ccc, eee]

5. Scan
Scan操作符對(duì)一個(gè)序列的數(shù)據(jù)應(yīng)用一個(gè)函數(shù),并將這個(gè)函數(shù)的結(jié)果發(fā)射出去作為下個(gè)數(shù)據(jù)應(yīng)用這個(gè)函數(shù)時(shí)候的第一個(gè)參數(shù)使用蓄诽。

   Observable.just(1,2,3,4,5).scan(new BiFunction<Integer, Integer, Integer>() {
            @Override
            public Integer apply(Integer integer, Integer integer2) throws Exception {
                return integer+integer2;
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                print(integer+"");
            }
        });
        Observable.fromArray(new String[]{"a","b","c","d","e"}).scan(new BiFunction<String, String, String>() {
            @Override
            public String apply(String s, String s2) throws Exception {
                return s+s2;
            }
        }).subscribe(getStringObserver("Scan"));
        //輸出結(jié)果
        //1 3 6 10 15
//        Scan-->String onSubscribe
//        Scan-->String onNext : value :a
//        Scan-->String onNext : value :ab
//        Scan-->String onNext : value :abc
//        Scan-->String onNext : value :abcd
//        Scan-->String onNext : value :abcde
//        Scan-->String onComplete

6.Window
window操作符會(huì)在時(shí)間間隔內(nèi)緩存結(jié)果薛训,類似于buffer緩存一個(gè)list集合,區(qū)別在于window將這個(gè)結(jié)果集合封裝成了observable

Observable.interval(300, TimeUnit.MILLISECONDS).take(50)
                .window(5, TimeUnit.SECONDS)
                .subscribe(new Consumer<Observable<Long>>() {
                    @Override
                    public void accept(Observable<Long> longObservable) throws Exception {
                        print("Window accept---------");
                        longObservable.subscribe(new Consumer<Long>() {
                            @Override
                            public void accept(Long aLong) throws Exception {
                                print(aLong+"");
                            }
                        });
                    }
                });
        //輸出結(jié)果:
        //Window accept---------
        //0
        //1
        //...
        //15
        //Window accept---------
        //16
        //...
        //32
        //Window accept---------
        //33
        //...
        //48
        //Window accept---------
        //49
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仑氛,一起剝皮案震驚了整個(gè)濱河市乙埃,隨后出現(xiàn)的幾起案子闸英,更是在濱河造成了極大的恐慌,老刑警劉巖介袜,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甫何,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡遇伞,警方通過(guò)查閱死者的電腦和手機(jī)辙喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸠珠,“玉大人巍耗,你說(shuō)我怎么就攤上這事〗ヅ牛” “怎么了炬太?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)驯耻。 經(jīng)常有香客問(wèn)我亲族,道長(zhǎng),這世上最難降的妖魔是什么吓歇? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任孽水,我火速辦了婚禮,結(jié)果婚禮上城看,老公的妹妹穿的比我還像新娘女气。我一直安慰自己,他們只是感情好测柠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布炼鞠。 她就那樣靜靜地躺著,像睡著了一般轰胁。 火紅的嫁衣襯著肌膚如雪谒主。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天赃阀,我揣著相機(jī)與錄音霎肯,去河邊找鬼。 笑死榛斯,一個(gè)胖子當(dāng)著我的面吹牛观游,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驮俗,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼懂缕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了王凑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躏哩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肋层,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片每篷。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓣戚,死狀恐怖端圈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情子库,我是刑警寧澤舱权,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站仑嗅,受9級(jí)特大地震影響宴倍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仓技,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一鸵贬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脖捻,春花似錦阔逼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至摩疑,卻和暖如春危融,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雷袋。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工吉殃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楷怒。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓蛋勺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親率寡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迫卢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位,與響應(yīng)式編程作為結(jié)合使用的冶共,對(duì)什么是操作乾蛤、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,844評(píng)論 0 10
  • 前言 按照官方的分類每界,操作符大致分為以下幾種: Creating Observables(Observable的創(chuàng)...
    小玉1991閱讀 1,043評(píng)論 0 1
  • RxJava正在Android開發(fā)者中變的越來(lái)越流行。唯一的問(wèn)題就是上手不容易家卖,尤其是大部分人之前都是使用命令式編...
    劉啟敏閱讀 1,849評(píng)論 1 7
  • 創(chuàng)建操作 用于創(chuàng)建Observable的操作符Create通過(guò)調(diào)用觀察者的方法從頭創(chuàng)建一個(gè)ObservableEm...
    rkua閱讀 1,814評(píng)論 0 1
  • 注:只包含標(biāo)準(zhǔn)包中的操作符眨层,用于個(gè)人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,186評(píng)論 2 8