Rx java 在RxJava2中使用flatMap或zip?

Rx java 在RxJava2中使用flatMap或zip?,rx-java,rx-java2,Rx Java,Rx Java2,我有一个名为Student的类,它有两个字段grade和school。这两个字段都需要从远程服务器获取。当返回两个结果时,我创建了一个新的Student对象 在RxJava的帮助下,我用两种方法完成了它,一种是在flatMap中,另一种是在zip操作符中 Observable<String> gradeObservable = Observable.create((ObservableOnSubscribe<String>) emitter -> {

我有一个名为
Student
的类,它有两个字段
grade
school
。这两个字段都需要从远程服务器获取。当返回两个结果时,我创建了一个新的
Student
对象

RxJava
的帮助下,我用两种方法完成了它,一种是在
flatMap
中,另一种是在
zip
操作符中

Observable<String> gradeObservable =
        Observable.create((ObservableOnSubscribe<String>) emitter -> {
            Thread.sleep(1000);
            emitter.onNext("senior");
        }).subscribeOn(Schedulers.io());

Observable<String> schoolObservable =
        Observable.create((ObservableOnSubscribe<String>) emitter -> {
            emitter.onNext("MIT");
        }).subscribeOn(Schedulers.io());
压缩版本
在我看来,
zip
似乎更清晰。因此在这种情况下,操作符
flatMap
zip
更好

您显然是在组成两个可观察对象,这就是本文的目的。不仅如此,
gradeObservable
schoolObservable
将与
zip()
并行执行,而您的
flatmap()
解决方案将序列化请求。所以,是的,
zip()
更好

gradeObservable
        .flatMap(grade ->
                schoolObservable.map(school -> {
                    Student student = new Student();
                    student.grade = grade;
                    student.school = school;
                    return student;
                }))
        .subscribe(student -> {
            System.out.println(student.grade);
            System.out.println(student.school);
        });
 Observable.zip(gradeObservable, schoolObservable, (grade, school) -> {
    Student student = new Student();
    student.grade = grade;
    student.school = school;
    return student;
}).subscribe(student -> {
    System.out.println(student.grade);
    System.out.println(student.school);
});