处理 Mono Inside Flux 平面图

Pra*_*dey 4 java functional-programming project-reactor

我有一串弦。对于每个字符串,我必须进行远程调用。但问题是,进行远程调用的方法实际上返回了 Mono 响应(显然,因为对应于单个请求,所以将有单个响应)。

处理此类情况的正确模式应该是什么?我能想到的一种解决方案是对流元素进行串行(或并行)调用,并将响应减少为单个响应并返回。

这是代码:

fluxObj.flatmap(a -> makeRemoteCall(a)//converts the Mono of the response to a Flux).reduce(...)
Run Code Online (Sandbox Code Playgroud)

我无法将头转入 . 该flatmap方法makeRemoteCall返回一个Mono. 但返回的是响应的flatmapa 。Flux首先,为什么会发生这种情况?其次,这是否意味着返回Flux包含单个响应对象(在 中返回Mono)?

Sim*_*slé 7

如果mapper Function返回 a ,则意味着中的每个源元素Mono(至多)有一个派生值。Flux

获得Function回报:

  • 给定值的空 Mono(例如Mono.empty())意味着该源值被“忽略”
  • Mono(如您的示例中所示)意味着该源值异步映射到另一个特定值
  • aFlux对于给定值有多个派生值意味着该源值异步映射到多个值

例如,给出以下内容flatMap

Flux.just("A", "B")
    .flatMap(v -> Mono.just("value" + v))
Run Code Online (Sandbox Code Playgroud)

订阅上述内容Flux<String>并打印发出的元素将产生:

valueA
valueB
Run Code Online (Sandbox Code Playgroud)

另一个有趣的例子:如果有延迟,可能会得到无序的结果。像这样:

Flux.just(300, 100)
    .flatMap(delay -> Mono.delay(Duration.ofMillis(delay))
                          .thenReturn(delay + "ms")
    )
Run Code Online (Sandbox Code Playgroud)

将导致 aFlux<String>产生:

100ms
300ms
Run Code Online (Sandbox Code Playgroud)