首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >项目反应堆中的flatMap、flatMapSequential和concatMap有什么区别?

项目反应堆中的flatMap、flatMapSequential和concatMap有什么区别?
EN

Stack Overflow用户
提问于 2022-04-22 15:18:04
回答 1查看 2.2K关注 0票数 4

我从文档中读到flatMap

异步地将由该Flux发出的元素转换为Publishers,然后通过合并将这些内部发布者夷为平地,从而使它们能够相互交织。

那个flatMapSequential

异步地将由该Flux发出的元素转换为Publishers,然后将这些内部发布者压平为单个Flux,但按照源元素的顺序合并它们。

而那个concatMap

异步地将由该Flux发出的元素转换为Publishers,然后将这些内部发布者平铺成一个Flux,顺序地使用级联方式保持顺序。这个操作符有三个维度可以与flatMap和flatMapSequential进行比较:生成内嵌和订阅:这个操作符在生成下一个内部并订阅之前等待一个内部完成。扁平值的排序:这个操作符自然地保持与源元素相同的顺序,将每个源元素的内嵌顺序连接起来。交织:这个运算符不允许来自不同内嵌的值交织(级联)。

flatMap和其他两个之间的区别是可以理解的,但是我不明白concatMapflatMapSequential之间的区别是什么时候发生的。两者在性能上有什么区别吗?我读过flatMapSequential有一个缓冲大小的某些队列,但我不明白为什么concatMap不需要一个队列。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-22 17:04:59

flatMapflatMapSequential操作符热切地订阅,concatMap等待每个内部完成,然后生成下一个子流并订阅它。

让我们看看一个例子:

代码语言:javascript
运行
复制
  @Test
  void test_flatMap() {
    Flux.just(1, 2, 3)
        .flatMap(this::doSomethingAsync)
        //.flatMapSequential(this::doSomethingAsync)
        //.concatMap(this::doSomethingAsync)
        .doOnNext(n -> log.info("Done {}", n))
        .blockLast();
  }

  private Mono<Integer> doSomethingAsync(Integer number) {
    //add some delay for the second item...
    return number == 2 ? Mono.just(number).doOnNext(n -> log.info("Executing {}", n)).delayElement(Duration.ofSeconds(1))
        : Mono.just(number).doOnNext(n -> log.info("Executing {}", n));
  }

输出:

代码语言:javascript
运行
复制
2022-04-22 19:38:49,164  INFO main - Executing 1
2022-04-22 19:38:49,168  INFO main - Done 1
2022-04-22 19:38:49,198  INFO main - Executing 2
2022-04-22 19:38:49,200  INFO main - Executing 3
2022-04-22 19:38:49,200  INFO main - Done 3
2022-04-22 19:38:50,200  INFO parallel-1 - Done 2

如您所见,flatMap没有保留原始顺序,而是热切地订阅了所有三个元素。另外,请注意元素3在元素2之前进行。

下面是使用flatMapSequential的输出

代码语言:javascript
运行
复制
2022-04-22 19:53:40,229  INFO main - Executing 1
2022-04-22 19:53:40,232  INFO main - Done 1
2022-04-22 19:53:40,261  INFO main - Executing 2
2022-04-22 19:53:40,263  INFO main - Executing 3
2022-04-22 19:53:41,263  INFO parallel-1 - Done 2
2022-04-22 19:53:41,264  INFO parallel-1 - Done 3

flatMapSequential热切地订阅了所有三个元素,比如flatMap,但是通过接收到的无序排序元素来保持顺序。

下面是使用concatMap的输出

代码语言:javascript
运行
复制
2022-04-22 19:59:31,817  INFO main - Executing 1
2022-04-22 19:59:31,820  INFO main - Done 1
2022-04-22 19:59:31,853  INFO main - Executing 2
2022-04-22 19:59:32,857  INFO parallel-1 - Done 2
2022-04-22 19:59:32,857  INFO parallel-1 - Executing 3
2022-04-22 19:59:32,857  INFO parallel-1 - Done 3

concatMap自然保持与源元素相同的顺序。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71971062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档