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線程上的。