Rx java 为什么flatMap在RxJava中使用merge实现?
为什么RxJava 1.x flatMap()运算符是用merge实现的Rx java 为什么flatMap在RxJava中使用merge实现?,rx-java,rx-android,flatmap,Rx Java,Rx Android,Flatmap,为什么RxJava 1.x flatMap()运算符是用merge实现的 public final <R> Observable<R> flatMap(Func1<? super T, ? extends Observable<? extends R>> func) { if (getClass() == ScalarSynchronousObservable.class) { return ((Scalar
public final <R> Observable<R> flatMap(Func1<? super T, ? extends Observable<? extends R>> func) {
if (getClass() == ScalarSynchronousObservable.class) {
return ((ScalarSynchronousObservable<T>)this).scalarFlatMap(func);
}
return merge(map(func));
}
公共最终可观测平面图(Func1
现在在平面图中,我们只能看到一个可见光,它发出一个可见光
否-您有一个可观察对象,每个源可观察项目发射一个可观察对象。因此,如果源可观察对象有更多项目,您将发射多个可观察对象
这就是为什么需要merge()
查看签名可能会有所帮助:
想象一下,使用可观察的
,您希望将平面映射
映射到各个字符。使用平面映射的方法是:
Observable.just("foo", "hello")
.flatMap(s -> Observable.from(s.split("")))
这个可观察的类型是什么?它是一个可观察的
现在,不要使用flatMap
,而是使用具有相同功能的map
。类型是什么
Observable.just("foo", "hello")
.map(s -> Observable.from(s.split("")))
您将看到它实际上是可观察的。。。
如果我们订阅这个可观察的并打印出发出的项目,我们得到:
rx.Observable@5b275dab
rx.Observable@61832929
不是很有用。更糟糕的是,这些可观察的尚未订阅,因此它们不会发出任何数据:(
我们看到,flatMap
的目标是让函数为每个源项生成一个内部的可观察的
,然后订阅这些内部可观察的,并在输出可观察的
中将它们的发射放平。而合并
就是这样做的
要验证这一点,请将上述映射结果包装成一个可观察的.merge(…)
:
Observable<Observable<String>> mapped =
Observable.just("foo", "hello")
.map(s -> Observable.from(s.split("")));
Observable.merge(mapped)
.subscribe(System.out::println);
f
o
o
h
e
l
l
o