摘要:前兩篇的使用一基本用法的使用二介紹了的基本用法,對還不了解的請先看以上兩篇。這篇為大家講解中和的使用。注意對這些發射的數據做的是合并操作,因此它們可能是交錯的。如果要保證順的的話,可以使用。其他操作符除了和之外,還有其他操作符以供使用。
前兩篇Android RxJava的使用(一)基本用法、Android RxJava的使用(二)Action介紹了RxJava的基本用法,對Rxjava還不了解的請先看以上兩篇。這篇為大家講解RxJava中map和flatMap的使用。
參考:給 Android 開發者的 RxJava 詳解回顧
(本文部分內容引用自該博客)
前兩篇為大家介紹了使用RxJava打印多個字符串的方法
Observable.just("Hellow", "Wrold").subscribe(new Action1() { @Override public void call(String s) { Log.i(TAG, s); } });
這樣的例子基本沒有實際用處,只是為大家演示如何使用Rxjava。今天就拋開這個例子。
map在使用map之前要先說道一個接口:Func1,Func1和上一篇提到的Action1相似。Func1?和?Action的區別在于,?Func1?包裝的是有返回值的方法。
接下來就是map的用法,看代碼更直觀點;
例:得到多個Student對象中的name,保存到nameList中
Observable.just(student1, student2, student2) //使用map進行轉換,參數1:轉換前的類型,參數2:轉換后的類型 .map(new Func1() { @Override public String call(Student i) { String name = i.getName();//獲取Student對象中的name return name;//返回name } }) .subscribe(new Action1 () { @Override public void call(String s) { nameList.add(s); } });
可以看到Observable中原來的參數是Student對象,而最后我們需要的是name,這里使用了map來實現這一轉換的過程。當然,map可以多次使用。
//多次使用map,想用幾個用幾個 Observable.just("Hello", "World") .map(new Func1flatMap() {//將String類型的轉化為Integer類型的哈希碼 @Override public Integer call(String s) { return s.hashCode(); } }) .map(new Func1 () {//將轉化后得到的Integer類型的哈希碼再轉化為String類型 @Override public String call(Integer integer) { return integer.intValue() + ""; } }) .subscribe(new Action1 () { @Override public void call(String s) { Log.i(TAG, s); } });
flatMap是一個比教難理解的一個轉換,在這里先假設一個需求,需要打印多個Student所學的課程。這跟之前獲取Student的name又不同了,這里先確定一下關系,一個Student類中只有一個name,而一個Student卻有多門課程(Course),Student我們可以理解成這樣:
/** * 學生類 */ class Student { private String name;//姓名 private ListcoursesList;//所修的課程 ... } /** * 課程類 */ class Course { private String name;//課程名 private String id; ... }
如果使用map來實現打印所有學生所修個課程名,實現的代碼是這樣的:
Liststudents = new ArrayList (); students.add... ... Action1 > action1 = new Action1
>() { @Override public void call(List
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 >() { @Override public List call(Student student) { //返回coursesList return student.getCoursesList(); } }) .subscribe(action1);
可以看到,在Action1中出現了for來循環打印課程名,使用RxJava就是為了剔除這樣的嵌套結構,使得整體的邏輯性更強。這時候就可以使用flatMap了,使用flatMap實現的代碼是這樣的:
Liststudents = new ArrayList (); students.add... ... Observable.from(students) .flatMap(new Func1 >() { @Override public Observable call(Student student) { return Observable.from(student.getCoursesList()); } }) .subscribe(new Action1 () { @Override public void call(Course course) { Log.i(TAG, course.getName()); } });
這樣就實現了跟上面代碼一樣的效果,看起來有點懵?確實,flatMap理解起來有點繞,剛接觸flatMap的時候我也是懵逼一個。下面我將flatMap的示意圖,希望能幫助理解:
由上圖可以看出Student1、Student2經過flatMap后,按順序依次經歷了Observable1、Observable2,分別轉化為Course。最后按順序得到Course1、Course2、Course3、Course4、Course5、Course6,其中1-3由Student1得到,4-6由Student2得到。
結合代碼和示意圖,是不是對flatMap有了一定的理解。
注意:FlatMap對這些Observables發射的數據做的是合并(merge)操作,因此它們可能是交錯的。也就說,傳入的順序可能跟出來的順序不一樣。其他操作符
如果要保證順的的話,可以使用concatMap。
除了map和flatMap之外,還有其他操作符以供使用。這里就不一一列舉他們的用法了,其他常用的操作符如下:
filter:集合進行過濾
each:遍歷集合
take:取出集合中的前幾個
skip:跳過前幾個元素
更多操作符
小結看完map、flatMap后,慢慢能看到RxJava的實際用處了。不過只是這點功能的RxJava是遠遠不能滿足我們的需求,更多的用法我只能在后面更新了。今天就到這里吧?。。?/p>
以上有錯誤之處感謝指出
更多:
Android RxJava的使用(四)線程控制 —— Scheduler
參考:給 Android 開發者的 RxJava 詳解
(本文部分內容引用自該博客)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73398.html
摘要:來總結一下我遇到的坑,或者說我為什么不在推薦使用。但是功利的看,在解決異步處理這個問題上,的確是投入高,收獲少。這種在輕量級應用,或者一些小型異步處理比如數據埋點等等行為中,都顯得過于龐大。距離上一次更新也有一段時間了,其實這篇文章我早就想寫,礙于一直沒來得及總結(懶)。所以一直沒有成文。來總結一下我RxJava遇到的坑,或者說我為什么不在推薦使用RxJava。 相信熟悉或者關注我的朋友,絕...
摘要:中使用那一套,線程的速度,你知道的而對于分布式數據流來說,本來就是并行的,這種參數意義就不大了。函數種類一般作用在數據流上的函數,會分為兩類。中的程序是實現在數據流上的。可以看作是的更新日志,數據流中的每一個記錄對應數據庫中的每一次更新。最近入職一個有趣的年輕同事,提交了大量大量的代碼。翻開git記錄一看,原來是用了非常多的java8的語法特性,重構了代碼。用的最多的,就是map、flatM...
摘要:中使用那一套,線程的速度,你知道的而對于分布式數據流來說,本來就是并行的,這種參數意義就不大了。函數種類一般作用在數據流上的函數,會分為兩類。中的程序是實現在數據流上的??梢钥醋魇堑母氯罩?,數據流中的每一個記錄對應數據庫中的每一次更新。最近入職一個有趣的年輕同事,提交了大量大量的代碼。翻開git記錄一看,原來是用了非常多的java8的語法特性,重構了代碼。用的最多的,就是map、flatM...
摘要:中使用那一套,線程的速度,你知道的而對于分布式數據流來說,本來就是并行的,這種參數意義就不大了。函數種類一般作用在數據流上的函數,會分為兩類。中的程序是實現在數據流上的。可以看作是的更新日志,數據流中的每一個記錄對應數據庫中的每一次更新。最近入職一個有趣的年輕同事,提交了大量大量的代碼。翻開git記錄一看,原來是用了非常多的java8的語法特性,重構了代碼。用的最多的,就是map、flatM...
閱讀 3001·2021-10-13 09:39
閱讀 2698·2021-09-27 13:34
閱讀 2037·2019-08-30 15:55
閱讀 3266·2019-08-30 15:43
閱讀 3641·2019-08-30 11:16
閱讀 1757·2019-08-26 18:28
閱讀 1293·2019-08-26 13:56
閱讀 918·2019-08-26 13:35