Android編程開發Rxjava使用技巧

Android編程開發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 Func1() {//將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

flatMap是一個比教難理解的一個轉換,在這裡先假設一個需求,需要打印多個Student所學的課程。這跟之前獲取Student的name又不同瞭,這裡先確定一下關系,一個Student類中隻有一個name,而一個Student卻有多門課程(Course),Student我們可以理解成這樣:

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

如果使用map來實現打印所有學生所修個課程名,實現的代碼是這樣的:

        List students = new ArrayList();
        students.add...
        ...

        Action1<list> action1 = new Action1<list>() {
            @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);
</list</list

可以看到,在Action1中出現瞭for來循環打印課程名,使用RxJava就是為瞭剔除這樣的嵌套結構,使得整體的邏輯性更強。這時候就可以使用flatMap瞭,使用flatMap實現的代碼是這樣的:

        List students = 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());
                    }
                });

可以看出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:跳過前幾個元素

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *