Rxjava系列二 轉(zhuǎn)換操作符

前篇文章我們介紹了一下基本的概念妻熊,現(xiàn)在我們聊一聊RxJava中的操作符亚脆,Rxjava中的操作符主要分為三類

  1. 轉(zhuǎn)換操作符(map flatMap concatMap FlatMapInterable SwitchMap Scan GroupBy)
  2. 過濾操作符(Fliter take takeLast takeUntil Distinc distincUntilChange Skip ...)
  3. 組合操作符(merge zip join combineLatest ...)
  • Map

    map()函數(shù)接受一股額Func1類型的參數(shù),然后把這個Func1應(yīng)用到每一個由Observable發(fā)射的值上,將發(fā)射的值轉(zhuǎn)化為我們期待的值。

    舉個例子: 假如我們的輸入為一組數(shù)字,然后我們需要將每個數(shù)字都轉(zhuǎn)化為字符串望抽,至于轉(zhuǎn)化為什么字符串隨意。便可通過map來實現(xiàn)

    Observable.just(1,2,3,4,5)
      .map(new Func1<Integer,String>(){
        public String call(Integer i){
          //1. 接受一個整數(shù) 并返回一個字符串
          return "Hello" + i;
        }
      }).subscribe(new Action1<String>(){
        public void call(Strings){
          //2. 直接將字符串打印出來
          System.out.println(s);
        }
      })
    

    ?

  • FlatMap

    FlatMap函數(shù)同樣也是做轉(zhuǎn)換的履婉,但是作用卻不太一樣煤篙,所以我打算舉例說明,假設(shè)現(xiàn)在有這么一個需求毁腿,有一列學(xué)生類辑奈,學(xué)生類有一個名字和他所選的多個課程。如何打印出每個學(xué)生所選的所有課程的名字呢狸棍,首先我們想到的就是map中來遍歷學(xué)生數(shù)組身害,然后在每個學(xué)生中遍歷輸出它的課程名稱

    Student[] students = ...;
    Subscriber<Student> subscriber = new Subscriber<Student>() {
        @Override
        public void onNext(Student student) {
            List<Course> courses = student.getCourses();
            for (int i = 0; i < courses.size(); i++) {
                Course course = courses.get(i);
            }
        }
        ...
    };
    Observable.from(students)
        .subscribe(subscriber);
    

    這么做當(dāng)然可以味悄,但是現(xiàn)在我們使用了Rxjava 所以我們像將這個for循環(huán)去掉草戈,這時候使用map顯然無法滿足我們的需求,因為map是一對一的轉(zhuǎn)化侍瑟,我們現(xiàn)在需要的是從每一個學(xué)生中選出多個課程唐片,這顯然是一個一對多的問題丙猬,這個是時候明顯就是需要使用flatMap了。

       Observable.from(students).flatMap(new Func1<Student, Observable<String>>() {
                @Override
                public Observable<String> call(Student student) {
                    return Observable.from(student.getCourse());
                }
            }).subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    System.out.println("Courser  " + s);
                }
            });
    

    FlatMap與Map之間的區(qū)別:

    • 都是將輸入的參數(shù)轉(zhuǎn)化之后返回明外一個對象
    • flatMap返回的是一個Observable對象费韭,并且這個Observable對象不是直接發(fā)送到Subscriber的回調(diào)方法中

    FlatMap的原理:1. 使用傳入的事件對象創(chuàng)建一個Observable對象 2. 并不發(fā)送這個Observable 茧球,而是將它激活,于是它開始發(fā)送時間 3. 每一個創(chuàng)建的Observable發(fā)送的事件星持,都被匯入同一個Observable抢埋,而這個Observable負責(zé)將這些時間統(tǒng)一交給Subscriber的回調(diào)。在這個過程中并不能保證事件的順序督暂。

  • ConcatMap

    ConcatMap解決了Flatmap的順序問題揪垄,它能夠把發(fā)射的值連續(xù)在一起。

  • Scan

    scan()對一個序列的數(shù)據(jù)應(yīng)用一個函數(shù) 兩個參數(shù)逻翁,并將這個函數(shù)的結(jié)果發(fā)射出去作為下個數(shù)據(jù)應(yīng)用合格函數(shù)時的第一個參數(shù)使用饥努。

    Observable.just(1, 2, 3, 4, 5)
            .scan(new Func2<Integer, Integer, Integer>() {
                @Override
                public Integer call(Integer integer, Integer integer2) {
                    return integer + integer2;
                }
            }).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            System.out.print(integer+“ ”);
        }
    });
    

    輸出結(jié)果為:1 3 6 10 15

  • GroupBy

    groupBy()將原始Observable發(fā)射的數(shù)據(jù)按照key來拆分成一些小的Observable,然后這些小Observable分別發(fā)射其所包含的的數(shù)據(jù)八回。實際使用中酷愧,我們需要提供一個生成key的規(guī)則(也就是Func1中的call方法),所有key相同的數(shù)據(jù)會包含在同一個小的Observable中缠诅。

    Observable<GroupedObservable<Integer, Student>> groupedObservableObservable = Observable.from(students).groupBy(s -> s.getScore());
    
     Observable.concat(groupedObservableObservable).subscribe(s -> System.out.println(s));
    

    通過生成一個groupedObservableObservable 一個帶有GroupedObservable的序列溶浴, 基于一個分組的key,然后按照分組一次輸出。

    ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滴铅,一起剝皮案震驚了整個濱河市戳葵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汉匙,老刑警劉巖拱烁,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異噩翠,居然都是意外死亡戏自,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門伤锚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來擅笔,“玉大人,你說我怎么就攤上這事屯援∶兔牵” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵狞洋,是天一觀的道長弯淘。 經(jīng)常有香客問我,道長吉懊,這世上最難降的妖魔是什么庐橙? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任假勿,我火速辦了婚禮,結(jié)果婚禮上态鳖,老公的妹妹穿的比我還像新娘转培。我一直安慰自己,他們只是感情好浆竭,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布浸须。 她就那樣靜靜地躺著,像睡著了一般邦泄。 火紅的嫁衣襯著肌膚如雪羽戒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天虎韵,我揣著相機與錄音易稠,去河邊找鬼。 笑死包蓝,一個胖子當(dāng)著我的面吹牛驶社,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播测萎,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亡电,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了硅瞧?” 一聲冷哼從身側(cè)響起份乒,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腕唧,沒想到半個月后或辖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡枣接,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年颂暇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片但惶。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡耳鸯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膀曾,到底是詐尸還是另有隱情县爬,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布添谊,位于F島的核電站财喳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碉钠。R本人自食惡果不足惜纲缓,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喊废。 院中可真熱鬧祝高,春花似錦、人聲如沸污筷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓣蛀。三九已至陆蟆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惋增,已是汗流浹背叠殷。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诈皿,地道東北人林束。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像稽亏,于是被迫代替她去往敵國和親壶冒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

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

  • 注:只包含標(biāo)準(zhǔn)包中的操作符截歉,用于個人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,193評論 2 8
  • 作者: maplejaw本篇只解析標(biāo)準(zhǔn)包中的操作符胖腾。對于擴展包,由于使用率較低瘪松,如有需求咸作,請讀者自行查閱文檔。 創(chuàng)...
    maplejaw_閱讀 45,661評論 8 93
  • 注:只包含標(biāo)準(zhǔn)包中的操作符宵睦,用于個人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 927評論 0 3
  • 我從去年開始使用 RxJava 性宏,到現(xiàn)在一年多了。今年加入了 Flipboard 后状飞,看到 Flipboard 的...
    Jason_andy閱讀 5,468評論 7 62
  • 鋼筋翻樣軟件诬辈,是編程技術(shù)人員專為鋼筋工程開發(fā)的施工計算軟件酵使,據(jù)說使用這種軟件處理數(shù)據(jù),要比手工計算快幾十倍焙糟。但是真...
    明瑞觀建筑閱讀 582評論 0 2