rxJava基础之八--事件变换

来源:互联网 发布:vb小游戏制作 编辑:程序博客网 时间:2024/04/30 07:59
事件变换的意思就是将事件或者是事件序列进行加工处理,转换成新同的事件或者新的事件序列发送给观察者,有两种:
map():解决单一的事件变换
Observable.just("images/meinv.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()就需要在subscriber里面用for循环拿出数据),也可以不用指定线
          程而执行联网请求异步代码
 

  (1)解决嵌套的事件变换:

如果有一个需求,输出每个学生的名字:

输入名字的代码:

public class MainActivity extends Activity {


protected static final String TAG = "MainActivity";
private List<Student> stus = new ArrayList<Student>();


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init4();
}
private void init4() {
// 遍历出每个学生的名字,这种没有嵌套的就直接输出
Observable.from(stus).map(new Func1<Student, String>() {


@Override
public String call(Student arg0) {
return arg0.name;
}
}).subscribe(new Subscriber<String>() {


@Override
public void onCompleted() {


}


@Override
public void onError(Throwable arg0) {


}


@Override
public void onNext(String arg0) {
Log.i(TAG, arg0);
}
});
}

}


但是如果需求改成输出每个学生的课程名字:

Observable.from(stus).subscribe(new Subscriber<Student>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable arg0) {
}
@Override
public void onNext(Student stu) {
List<Course> courses = stu.getCourses();
for (int i = 0; i < courses.size(); i++) {
Course course = courses.get(i);
Log.d(TAG, course.getName());
}
}
});


但是这里不想在subscriber里面进行循环操作。所以就用faltMaop的来处理嵌套问题:

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) {

//跟for(Stuent stu : Studnets)是一个意思
           return Observable.from(student.getCourses());
       }
   })
   .subscribe(subscriber);

0 0