在RxJava2中使用flatMap或zip?

CoX*_*ier 1 rx-java rx-java2

我有一门课Student,它有两个字段gradeschool。这两个字段都需要从远程服务器中获取。当返回两个结果时,我新建了一个Student对象。

在的帮助下RxJava,我以两种方式完成了此操作,一种是flatMapin zip运算符,另一种是in 运算符。

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());
Run Code Online (Sandbox Code Playgroud)

flatMap版本

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);
        });
Run Code Online (Sandbox Code Playgroud)

压缩版本

 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);
});
Run Code Online (Sandbox Code Playgroud)

我认为,zip似乎更清楚。那么在这种情况下,flatMap还是zip算算更好

Geo*_*izy 5

您显然正在组成两个可观察的对象,这是的目的zip()。不仅如此,但gradeObservableschoolObservable会在并行执行的zip(),而你的flatmap()解决方案将序列请求。所以,是的,zip()更好。