在 RxJava2 中使用 flatMap 还是 zip? [英] Use flatMap or zip in RxJava2?
问题描述
我有一个名为 Student
的班级,它有两个字段 grade
和 school
.两个字段都需要从远程服务器获取.当返回两个结果时,我新建了一个 Student
对象.
I have a class called Student
and it has two fields grade
and school
. Both of two fields need to be fetched from remote server. When two result returned, I new a Student
object.
在RxJava
的帮助下,我以两种方式完成,一种在flatMap
中,另一种在zip
运算符中.
With help of RxJava
, I have done it in two ways, one in flatMap
and another in zip
operator.
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);
});
压缩版本
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);
});
在我看来,zip
似乎更清楚.那么在这种情况下,运算符 flatMap
还是 zip
更好?
In my opinion, zip
seems more clearly. So in this situation, operator flatMap
or zip
is better?
推荐答案
你显然是在组合两个 observable,这就是 zip()
.不仅如此,gradeObservable
和 schoolObservable
将与 zip()
并行执行,而您的 flatmap()
解决方案将序列化请求.所以,是的,zip()
更好.
You are clearly composing two observable, which is the purpose of zip()
. Not only that but gradeObservable
and schoolObservable
would be executed in parallel with zip()
whereas your flatmap()
solution would serialize requests. So, yes, zip()
is better.
这篇关于在 RxJava2 中使用 flatMap 还是 zip?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!