RxJava中的concatMap和flatMap有什么区别

2022-08-31 15:32:05

似乎这两个功能非常相似。它们具有相同的签名(接受),并且它们的大理石图看起来完全相同。无法将图片粘贴到此处,但这里有一张用于 concatMap,另一张用于 flatMap。在结果的描述中似乎存在一些细微的差异,其中 由 生成的包含由连接生成的可观察量而产生的项,而 由 生成的包含首先合并生成的可观察量并发出该合并结果的项。rx.functions.Func1<? super T, ? extends Observable<? extends R>> funcObservableconcatMapflatMap

然而,这种微妙之处对我来说是完全不清楚的。任何人都可以对这种差异给出更好的解释,理想情况下,给出一些例子来说明这种差异。


答案 1


正如你所写的,这两个函数非常相似,细微的区别是如何创建输出的(在应用映射函数之后)。

平面地图使用合并运算符,而 concatMap 使用 concat 运算符

如您所见,concatMap 输出序列是有序的 - 第一个 Observable 发出的所有项目都先于第二个 Observable 发出的任何项目发出,
而 flatMap 输出序列被合并 - 合并的 Observable 发出的项目可以按任何顺序显示,无论它们来自哪个可观察源。


答案 2

尽管这里的答案很好,但如果没有一个例子,就不容易发现差异。因此,我为此创建了一个简单的示例:

@Test
public void flatMapVsConcatMap() throws Exception {
    System.out.println("******** Using flatMap() *********");
    Observable.range(1, 15)
            .flatMap(item -> Observable.just(item).delay(1, TimeUnit.MILLISECONDS))
            .subscribe(x -> System.out.print(x + " "));

    Thread.sleep(100);

    System.out.println("\n******** Using concatMap() *********");
    Observable.range(1, 15)
            .concatMap(item -> Observable.just(item).delay(1, TimeUnit.MILLISECONDS))
            .subscribe(x -> System.out.print(x + " "));

    Thread.sleep(100);
}

使用 flatMap() *********

1 2 3 4 5 6 7 9 8 11 13 15 10 12 14

使用 concatMap() *********

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

从输出中可以看出,的结果是无序的,而它们是无序的。flatMapconcatMap


推荐