// 1 新的需求 打印一组student[]的名字 // 伪代码
final Student[] students = null;
Subscriber<Student> subscriber = new Subscriber<Student>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(Student student) {
Log.i(TAG, "onNext: " + student.mString);
}
};
// 思路 :使用map 吧student 变换为 String 即可
// 被观察者产生相应的变换 观察者获得结果
Observable.from(students).map(new Func1<Student,String>() {
@Override
public String call(Student student) {
return student.mString;
}
}).subscribe((Action1<? super String>) subscriber);
//2 需求修改 如果查看学生的没一门课程 ( 不需要 改变类型 直接调用酒客)
Subscriber<Student> subscriber1 = new Subscriber<Student>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(Student student) {
List<Student.Course> mList = student.mList;
for (Student.Course course : mList) {
Log.i(TAG, "onNext: " + course.name);
}
}
};
Observable.from(students).subscribe(subscriber1);
// 依然很简单。那么如果我不想在 Subscriber 中使用 for 循环,
// 而是希望 Subscriber 中直接传入单个的 Course 对象呢(这对于代码复用很重要)?
// 用 map() 显然是不行的,因为 map() 是一对一的转化,而我现在的要求是一对多的转化。
// 那怎么才能把一个 Student 转化成多个 Course 呢?
//这个时候,就需要用 flatMap() 了:
// flatmap使用:flatmap(new Fun1<student,Observable<T>>)
// 上面的案例 实现
Subscriber<Student.Course> subscriber2 = new Subscriber<Student.Course>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(Student.Course course) {
Log.i(TAG, "onNext: "+course.name);
}
};
Observable.from(students).flatMap(new Func1<Student, Observable<Student.Course>>() {
@Override
public Observable<Student.Course> call(Student student) {
return Observable.from(student.mCourse) ;
}
});
网友评论