from vs just
just
内部就是调用的from
,但just
最多只能接受9个参数
map vs flatmap
-
map
和flatmap
返回的都是Observable
-
flatmap
的参数FuncX
的最后一个模板参数必须是从Observable
派生,也就是flatmap
实际返回的类型;而map
的参数FuncX
的最后一个模板参数则和map
返回的Observable
的模板参数是一致的 - 如果是1对1的转换,则
map
和flatmap
都可以。 - 如果是1对多的转换,则应该使用
flatmap
,这是因为map
的FuncX
返回的不是Observable
, 没有办法实现1对多;而flatmap
的FuncX
返回的是Observable
,FuncX
内部可以返回Observable.from(...)
,实现1对多的转换,例如:
/**
* 学生类
*/
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
- 如果利用
subscribeOn
指定了subscribe线程(事件产生的线程),则诸如map
,filter
,take
等操作符都是在subscribe线程上运行的。 - 如果指定了subscribe线程,但没有利用
observeOn
指定observe线程(事件消费的线程),则observer的action都是运行在subscribe线程上的。