我从文档中读到flatMap
异步地将由该Flux发出的元素转换为Publishers,然后通过合并将这些内部发布者夷为平地,从而使它们能够相互交织。
那个flatMapSequential
异步地将由该Flux发出的元素转换为Publishers,然后将这些内部发布者压平为单个Flux,但按照源元素的顺序合并它们。
而那个concatMap
异步地将由该Flux发出的元素转换为Publishers,然后将这些内部发布者平铺成一个Flux,顺序地使用级联方式保持顺序。这个操作符有三个维度可以与flatMap和flatMapSequential进行比较:生成内嵌和订阅:这个操作符在生成下一个内部并订阅之前等待一个内部完成。扁平值的排序:这个操作符自然地保持与源元素相同的顺序,将每个源元素的内嵌顺序连接起来。交织:这个运算符不允许来自不同内嵌的值交织(级联)。
flatMap
和其他两个之间的区别是可以理解的,但是我不明白concatMap
和flatMapSequential
之间的区别是什么时候发生的。两者在性能上有什么区别吗?我读过flatMapSequential
有一个缓冲大小的某些队列,但我不明白为什么concatMap
不需要一个队列。
发布于 2022-04-22 17:04:59
flatMap
和flatMapSequential
操作符热切地订阅,concatMap
等待每个内部完成,然后生成下一个子流并订阅它。
让我们看看一个例子:
@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));
}
输出:
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
的输出
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
的输出
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
自然保持与源元素相同的顺序。
https://stackoverflow.com/questions/71971062
复制相似问题