代码之家  ›  专栏  ›  技术社区  ›  CoXier

在RxJava2中使用flatMap或zip?

  •  3
  • CoXier  · 技术社区  · 8 年前

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

    借助于 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());
    

    平面图版本

    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);
            });
    

    zip版本

     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);
    });
    

    在我看来, 拉链 看起来更清楚了。所以 在这种情况下,操作员 平面图 或 拉链 更好 ?

    1 回复  |  直到 8 年前
        1
  •  8
  •   Geoffrey Marizy    8 年前

    很明显,你是在组成两个可观察的,这是 zip() 。不仅如此 gradeObservable 和 schoolObservable 将与 zip() 鉴于 flatmap() 解决方案将序列化请求。所以,是的, zip() 更好。