操作符:
map操作符:将Observable发送的信息进行格式的转换和处理,然后转变为另一种类型,发送给Observer。
Observable.just("images/logo.png") // 输入类型 String
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String filePath) { // 参数类型 String
return getBitmapFromPath(filePath); // 返回类型 Bitmap
}
}) .subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) { // 参数类型 Bitmap
showBitmap(bitmap);
}
});
flatMap操作符:
与map有一个相同点,它也是把传入的参数转化之后返回另一个对象。但是需要注意的是和map不同,flatmap返回的是个observable对象,并且这个observable对象并不是被直接发送到subscriber的回调方法中。
flatmap的原理是这样:
(1)使用传入的事件对象创建一个observable对象。
(2)并不发送这个observable对象,而是将它激活,于是他开始发送事件。
(3)每一个创建出来的observable发送的事件,都被汇入同一个observable,而这个observable负责将这些事件统一交给Subscriber的回调方法。
这三个步骤将原本的事件拆成两级,通过一组新创建的observable将初始的对象铺平后通过统一路径分发出去。
下面的例子演示了flatmap的作用:
打印出每个学生所需要修的所有课程的名称呢?(需求的区别在于,每个学生只有一个名字,但却有多个课程。)
Student[] students = ...;
Subscriber<Course> subscriber = new Subscriber<Course>() {
@Override
public void onNext(Course course) {
Log.d(tag, course.getName());
}
...
};
Observable.from(students)
.flatMap(new Func1<Student, Observable<Course>>() {
@Override
public Observable<Course> call(Student student) {
return Observable.from(student.getCourses());
}
}) .subscribe(subscriber);