处理Mono内部助焊剂平面图

时间:2018-12-31 15:14:00

标签: java functional-programming project-reactor

我有许多弦乐。对于每个字符串,我都必须进行远程呼叫。但是问题在于,进行远程调用的方法实际上返回了响应的Mono(显然,由于对应于单个请求,因此将只有一个响应)。

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

代码如下:

fluxObj.flatmap(a -> makeRemoteCall(a)//converts the Mono of the response to a Flux).reduce(...)

我无法将头缠在flatmap内。makeRemoteCall方法返回一个Mono。但是flatmap返回响应的Flux。首先,为什么会这样?其次,这是否意味着返回的Flux包含一个响应对象(在Mono中返回)?

2 个答案:

答案 0 :(得分:1)

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

返回Function

  • 给定值的空Mono(例如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仅包含一个元素。