【Android】RxJava的使用(三)轉(zhuǎn)換——map凿菩、flatMap

前兩篇Android RxJava的使用(一)基本用法艾杏、Android RxJava的使用(二)Action介紹了RxJava的基本用法,對Rxjava還不了解的請先看以上兩篇庸追。這篇為大家講解RxJava中map和flatMap的使用。

參考:給 Android 開發(fā)者的 RxJava 詳解
(本文部分內(nèi)容引用自該博客)

回顧

前兩篇為大家介紹了使用RxJava打印多個字符串的方法

     Observable.just("Hellow", "Wrold").subscribe(new Action1<String>() {
          @Override
          public void call(String s) {
              Log.i(TAG, s);
          }
      });

這樣的例子基本沒有實際用處台囱,只是為大家演示如何使用Rxjava淡溯。今天就拋開這個例子。

map

在使用map之前要先說道一個接口:Func1簿训,F(xiàn)unc1和上一篇提到的Action1相似咱娶。Func1 和 Action的區(qū)別在于, Func1 包裝的是有返回值的方法强品。
接下來就是map的用法膘侮,看代碼更直觀點;
例:得到多個Student對象中的name的榛,保存到nameList中

        Observable.just(student1, student2, student2)
                //使用map進行轉(zhuǎn)換琼了,參數(shù)1:轉(zhuǎn)換前的類型,參數(shù)2:轉(zhuǎn)換后的類型
                .map(new Func1<Student, String>() {
                    @Override
                    public String call(Student i) {
                        String name = i.getName();//獲取Student對象中的name
                        return name;//返回name
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        nameList.add(s);
                    }
                });

可以看到Observable中原來的參數(shù)是Student對象困曙,而最后我們需要的是name表伦,這里使用了map來實現(xiàn)這一轉(zhuǎn)換的過程。當然慷丽,map可以多次使用蹦哼。

        //多次使用map,想用幾個用幾個
        Observable.just("Hello", "World")
                .map(new Func1<String, Integer>() {//將String類型的轉(zhuǎn)化為Integer類型的哈希碼
                    @Override
                    public Integer call(String s) {
                        return s.hashCode();
                    }
                })
                .map(new Func1<Integer, String>() {//將轉(zhuǎn)化后得到的Integer類型的哈希碼再轉(zhuǎn)化為String類型
                    @Override
                    public String call(Integer integer) {
                        return integer.intValue() + "";
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.i(TAG, s);
                    }
                });

flatMap

flatMap是一個比教難理解的一個轉(zhuǎn)換要糊,在這里先假設一個需求纲熏,需要打印多個Student所學的課程。這跟之前獲取Student的name又不同了,這里先確定一下關(guān)系局劲,一個Student類中只有一個name勺拣,而一個Student卻有多門課程(Course),Student我們可以理解成這樣:

    /**
     * 學生類
     */
    class Student {
        private String name;//姓名
        private List<Course> coursesList;//所修的課程
        ...
    }
    /**
     * 課程類
     */
    class  Course {
        private String name;//課程名
        private String id;
        ...
    }

如果使用map來實現(xiàn)打印所有學生所修個課程名鱼填,實現(xiàn)的代碼是這樣的:

        List<Student> students = new ArrayList<Student>();
        students.add...
        ...

        Action1<List<Course>> action1 = new Action1<List<Course>>() {
            @Override
            public void call(List<Course> courses) {
                //遍歷courses药有,輸出cuouses的name
                 for (int i = 0; i < courses.size(); i++){
                    Log.i(TAG, courses.get(i).getName());
                }
            }
        };
        Observable.from(students)
                .map(new Func1<Student, List<Course>>() {
                    @Override
                    public List<Course> call(Student student) {
                        //返回coursesList
                        return student.getCoursesList();
                    }
                })
                .subscribe(action1);

可以看到,在Action1中出現(xiàn)了for來循環(huán)打印課程名苹丸,使用RxJava就是為了剔除這樣的嵌套結(jié)構(gòu)愤惰,使得整體的邏輯性更強。這時候就可以使用flatMap了赘理,使用flatMap實現(xiàn)的代碼是這樣的:

        List<Student> students = new ArrayList<Student>();
        students.add...
        ...

        Observable.from(students)
                .flatMap(new Func1<Student, Observable<Course>>() {
                    @Override
                    public Observable<Course> call(Student student) {
                        return Observable.from(student.getCoursesList());
                    }
                })
                .subscribe(new Action1<Course>() {
                    @Override
                    public void call(Course course) {
                        Log.i(TAG, course.getName());
                    }
                });

這樣就實現(xiàn)了跟上面代碼一樣的效果宦言,看起來有點懵?確實商模,flatMap理解起來有點繞奠旺,剛接觸flatMap的時候我也是懵逼一個。下面我將flatMap的示意圖施流,希望能幫助理解:


flatMap示意圖

由上圖可以看出Student1响疚、Student2經(jīng)過flatMap后,按順序依次經(jīng)歷了Observable1嫂沉、Observable2稽寒,分別轉(zhuǎn)化為Course。最后按順序得到Course1趟章、Course2、Course3慎王、Course4蚓土、Course5、Course6赖淤,其中1-3由Student1得到蜀漆,4-6由Student2得到。
結(jié)合代碼和示意圖咱旱,是不是對flatMap有了一定的理解确丢。

注意:FlatMap對這些Observables發(fā)射的數(shù)據(jù)做的是合并(merge)操作,因此它們可能是交錯的吐限。也就說鲜侥,傳入的順序可能跟出來的順序不一樣。
如果要保證順的的話诸典,可以使用concatMap描函。

其他操作符

除了map和flatMap之外,還有其他操作符以供使用。這里就不一一列舉他們的用法了舀寓,其他常用的操作符如下:

filter:集合進行過濾
each:遍歷集合
take:取出集合中的前幾個
skip:跳過前幾個元素

更多操作符

小結(jié)

看完map胆数、flatMap后,慢慢能看到RxJava的實際用處了互墓。不過只是這點功能的RxJava是遠遠不能滿足我們的需求必尼,更多的用法我只能在后面更新了。今天就到這里吧4勰臁R任椤!

以上有錯誤之處感謝指出

更多:
Android RxJava的使用(四)線程控制 —— Scheduler

參考:給 Android 開發(fā)者的 RxJava 詳解
(本文部分內(nèi)容引用自該博客)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酸休,一起剝皮案震驚了整個濱河市骂租,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斑司,老刑警劉巖渗饮,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宿刮,居然都是意外死亡互站,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進店門僵缺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胡桃,“玉大人,你說我怎么就攤上這事磕潮〈湟龋” “怎么了?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵自脯,是天一觀的道長之景。 經(jīng)常有香客問我,道長膏潮,這世上最難降的妖魔是什么锻狗? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮焕参,結(jié)果婚禮上轻纪,老公的妹妹穿的比我還像新娘。我一直安慰自己叠纷,他們只是感情好刻帚,可當我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讲岁,像睡著了一般我擂。 火紅的嫁衣襯著肌膚如雪衬以。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天校摩,我揣著相機與錄音看峻,去河邊找鬼。 笑死衙吩,一個胖子當著我的面吹牛互妓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坤塞,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼冯勉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摹芙?” 一聲冷哼從身側(cè)響起灼狰,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浮禾,沒想到半個月后交胚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡盈电,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年蝴簇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匆帚。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡熬词,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吸重,到底是詐尸還是另有隱情互拾,我是刑警寧澤,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布晤锹,位于F島的核電站摩幔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鞭铆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一焦影、第九天 我趴在偏房一處隱蔽的房頂上張望车遂。 院中可真熱鬧,春花似錦斯辰、人聲如沸舶担。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衣陶。三九已至柄瑰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剪况,已是汗流浹背教沾。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留译断,地道東北人授翻。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像孙咪,于是被迫代替她去往敵國和親堪唐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,580評論 2 349

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