当前位置: 首页 > 知识库问答 >
问题:

在项目Reactor中,平面图、平面图序列和concatMap有什么区别?

禄奇希
2023-03-14

我从留档中读到平面图

将该流量发出的元素异步转换为发布者,然后通过合并将这些内部发布者平坦化为单个流量,从而允许它们交错。

那个平MapSequential

将此流量发出的元素异步转换为发布者,然后将这些内部发布者平坦化为单个流量,但按其源元素的顺序合并它们。

并且concatMap

将此流量发出的元素异步转换为发布者,然后将这些内部发布者展平为单个流量,顺序并使用串联保持顺序。该运算符有三个维度可以与flatMap和flatMapSequential进行比较:

生成内部消息和订阅:该操作符等待一个内部消息完成,然后生成下一个内部消息并订阅它。

展平值的顺序:该操作符自然保持与源元素相同的顺序,将每个源元素的内部元素顺序连接起来。

交错:该运算符不允许来自不同内部的值交错(串联)。

平面地图和其他两个之间的区别是可以理解的,但是我不明白concatMap平MapSequential之间的区别是什么时候发生的。两者之间有任何性能差异吗?我读过平MapSequential对某些队列有一个缓冲区大小,但我不明白为什么concatMap不需要一个。

共有1个答案

笪德华
2023-03-14

这个

让我们来看一个例子:

  @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 Flux<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

如您所见,平面图不保留原始排序,并且急切地订阅了所有三个元素。此外,请注意元素3在元素2之前进行。

这是使用194 MapSequential的输出:

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

平面图序列急切地订阅了所有三个元素,如平面图,但通过以下方式保留顺序

以下是使用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

连接图

 类似资料:
  • 通量上的平面图总是连续的吗?我知道在flatMap返回通量中使用then函数时不是顺序的。项目Reactor平面图 但是如果flatMap中使用的函数返回mono,它是否总是顺序的? 假设我有一个函数,它接受一个对象,只返回Mono。 然后呢 总是返回2,3,4,5?

  • 我已经找到了很多关于RxJava的答案,但我想了解它在Reactor中是如何工作的。 我目前的理解是非常模糊的,我倾向于认为map是同步的,flatMap是异步的,但我不能真正理解它。 以下是一个例子: 我有文件(a

  • 我继续玩Retor,现在我看到运算符的行为完全类似于,我想知道是否有任何我不明白的区别。 这两个示例的行为和返回的结果相同。 问候。

  • 你好 在这里,我做了两个元素的通量,然后通过平面图公开第一个异常,第二个通量。 使用onErrorResume,我希望输出 但什么也得不到。谁能解释一下为什么会这样? 谢谢

  • 似乎在Swift 4.1中已弃用。但是在Swift 4.1中有一个新方法正在做同样的事情?使用,您可以转换集合中的每个对象,然后删除任何为nil的项目。 喜欢平面图 像compactMap compactMap也在做同样的事情。 这两种方法有什么区别?为什么苹果决定重命名该方法?

  • 这两种方法有什么区别:和? 请举个例子。