我有许多弦乐。对于每个字符串,我都必须进行远程呼叫。但是问题在于,进行远程调用的方法实际上返回了响应的Mono(显然,由于对应于单个请求,因此将只有一个响应)。
处理此类情况的正确模式应该是什么?我能想到的一种解决方案是对流元素进行串行(或并行)调用,并将响应减少为一个并返回。
代码如下:
fluxObj.flatmap(a -> makeRemoteCall(a)//converts the Mono of the response to a Flux).reduce(...)
我无法将头缠在flatmap
内。makeRemoteCall
方法返回一个Mono
。但是flatmap
返回响应的Flux
。首先,为什么会这样?其次,这是否意味着返回的Flux
包含一个响应对象(在Mono
中返回)?
答案 0 :(得分:1)
如果mapper Function
返回一个Mono
,则意味着Flux
中的每个源元素将(最多)有一个派生值。
返回Function
:
Mono.empty()
)表示此源值被“忽略” Mono
(例如您的示例)意味着该源值被异步映射到另一个特定值Flux
意味着该源值被异步映射到多个值例如,给定以下flatMap
:
Flux.just("A", "B")
.flatMap(v -> Mono.just("value" + v))
订阅以上Flux<String>
并打印发出的元素将产生:
valueA
valueB
另一个有趣的例子:延迟可以使结果混乱。像这样:
Flux.just(300, 100)
.flatMap(delay -> Mono.delay(Duration.ofMillis(delay))
.thenReturn(delay + "ms")
)
将导致Flux<String>
产生:
100ms
300ms
答案 1 :(得分:0)
如果您看到文档flatMap,则可以找到问题的答案:
将此Flux发出的元素异步转换为Publisher,然后将这些内部发布者展平为单个Flux,并按顺序保留并保持串联。
长话短说
@Test
public void testFlux() {
Flux<String> oneString = Flux.just("1");
oneString
.flatMap(s -> testMono(s))
.collectList()
.subscribe(integers -> System.out.println("elements:" + integers));
}
private Mono<Integer> testMono(String s) {
return Mono.just(Integer.valueOf(s + "0"));
}
映射器 -s -> testMono(s)
,其中testMono(s)
是发布者(在您的情况下是makeRemoteCall(a)
),它转换了我的{ {1}}到 整数 。
我将磁通量结果收集到列表中,并将其打印出来。控制台输出:
oneString
这意味着elements:[10]
运算符之后的结果Flux仅包含一个元素。