RxJava

2017-05-08  本文已影响0人  yuansip

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线程上的。
上一篇下一篇

猜你喜欢

热点阅读