前兩篇Android RxJava的使用(一)基本用法、Android RxJava的使用(二)Action介紹了RxJava的基本用法,對Rxjava還不瞭解的請先看以上兩篇。這篇爲你們講解RxJava中map和flatMap的使用。java
參考: 給 Android 開發者的 RxJava 詳解
(本文部份內容引用自該博客)
前兩篇爲你們介紹了使用RxJava打印多個字符串的方法ide
Observable.just("Hellow", "Wrold").subscribe(new Action1<String>() { @Override public void call(String s) { Log.i(TAG, s); } });
這樣的例子基本沒有實際用處,只是爲你們演示如何使用Rxjava。今天就拋開這個例子。post
在使用map以前要先說道一個接口:Func1,Func1和上一篇提到的Action1類似。Func1 和 Action的區別在於, Func1 包裝的是有返回值的方法。
接下來就是map的用法,看代碼更直觀點;
例:獲得多個Student對象中的name,保存到nameList中spa
Observable.just(student1, student2, student2) //使用map進行轉換,參數1:轉換前的類型,參數2:轉換後的類型 .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中原來的參數是Student對象,而最後咱們須要的是name,這裏使用了map來實現這一轉換的過程。固然,map能夠屢次使用。線程
//屢次使用map,想用幾個用幾個 Observable.just("Hello", "World") .map(new Func1<String, Integer>() {//將String類型的轉化爲Integer類型的哈希碼 @Override public Integer call(String s) { return s.hashCode(); } }) .map(new Func1<Integer, String>() {//將轉化後獲得的Integer類型的哈希碼再轉化爲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是一個比教難理解的一個轉換,在這裏先假設一個需求,須要打印多個Student所學的課程。這跟以前獲取Student的name又不一樣了,這裏先肯定一下關係,一個Student類中只有一個name,而一個Student卻有多門課程(Course),Student咱們能夠理解成這樣:code
/** * 學生類 */ class Student { private String name;//姓名 private List<Course> coursesList;//所修的課程 ... } /** * 課程類 */ class Course { private String name;//課程名 private String id; ... }
若是使用map來實現打印全部學生所修個課程名,實現的代碼是這樣的:對象
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中出現了for來循環打印課程名,使用RxJava就是爲了剔除這樣的嵌套結構,使得總體的邏輯性更強。這時候就可使用flatMap了,使用flatMap實現的代碼是這樣的:接口
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()); } });
這樣就實現了跟上面代碼同樣的效果,看起來有點懵?確實,flatMap理解起來有點繞,剛接觸flatMap的時候我也是懵逼一個。下面我將flatMap的示意圖,但願能幫助理解:
由上圖能夠看出Student一、Student2通過flatMap後,按順序依次經歷了Observable一、Observable2,分別轉化爲Course。最後按順序獲得Course一、Course二、Course三、Course四、Course五、Course6,其中1-3由Student1獲得,4-6由Student2獲得。
結合代碼和示意圖,是否是對flatMap有了必定的理解。ip
注意:FlatMap對這些Observables發射的數據作的是合併(merge)操做,所以它們多是交錯的。也就說,傳入的順序可能跟出來的順序不同。
若是要保證順的的話,可使用concatMap。
除了map和flatMap以外,還有其餘操做符以供使用。這裏就不一一列舉他們的用法了,其餘經常使用的操做符以下:開發
filter:集合進行過濾
each:遍歷集合
take:取出集合中的前幾個
skip:跳過前幾個元素
看完map、flatMap後,慢慢能看到RxJava的實際用處了。不過只是這點功能的RxJava是遠遠不能知足咱們的需求,更多的用法我只能在後面更新了。今天就到這裏吧!!!
以上有錯誤之處感謝指出
更多:
Android RxJava的使用(四)線程控制 —— Scheduler
參考:給 Android 開發者的 RxJava 詳解(本文部份內容引用自該博客)