Rx java 为什么flatMap在RxJava中使用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

为什么RxJava 1.x flatMap()运算符是用merge实现的

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