RxJava

from vs just

just內部就是調用的from,但just最多只能接受9個參數

map vs flatmap

  1. mapflatmap返回的都是Observable
  2. flatmap的參數FuncX的最后一個模板參數必須是從Observable派生,也就是flatmap實際返回的類型;而map的參數FuncX的最后一個模板參數則和map返回的Observable的模板參數是一致的
  3. 如果是1對1的轉換,則mapflatmap都可以。
  4. 如果是1對多的轉換,則應該使用flatmap,這是因為mapFuncX返回的不是Observable, 沒有辦法實現1對多;而flatmapFuncX返回的是ObservableFuncX內部可以返回Observable.from(...),實現1對多的轉換,例如:

【Android】RxJava的使用(三)轉換——map、flatMap

/**
     * 學生類
     */
    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());
                    }
                });

這樣就實現了跟上面代碼一樣的效果。

Thread

  1. 如果利用subscribeOn指定了subscribe線程(事件產生的線程),則諸如map,filter,take等操作符都是在subscribe線程上運行的。
  2. 如果指定了subscribe線程,但沒有利用observeOn指定observe線程(事件消費的線程),則observer的action都是運行在subscribe線程上的。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容