【问题标题】:Combine all elements to a flux to mono将所有元素组合成一个通量到单声道
【发布时间】:2021-07-05 13:26:52
【问题描述】:

这是我面临的问题的简化示例。

Flux<String> fluxString = Flux.just("A","B","C");
Mono<String> monoString = Mono.just("Original");

预期结果是这样的

Mono<String> expectedresult = "Original A B C";

方法 1 -> 我可以等待接收到助焊剂的所有元素,然后将它们与单声道组合

方法 2-> 将通量的每个元素组合成单声道,并在接收到下一个通量元素之前用新值更新原始单声道。 以上哪种方法适合我?

我用下面的代码尝试了方法 2

Flux<String> fluxfrommono = monoString.flatMapMany(a-> Mono.just(a).repeat());
Flux.zip(fluxfrommono ,fluxString  ,(a,b)-> a+b)

但这会产生“原始 A”、“原始 B”、“原始 C”->原始字符串不会更新为每个通量元素的新值。

如何做到这一点?

【问题讨论】:

    标签: java spring spring-webflux project-reactor reactor-netty


    【解决方案1】:

    为我写的代码-

    Flux<String> fluxString = Flux.just("A","B","C");
    Mono<String> monoString = Mono.just("Original");
    Mono<String> combinedString = fluxString.reduce((a,b)->a+b);
    Mono<String> expectedresult = Mono.zip(monoString ,combinedString ,(a,b)->a+b);
    

    【讨论】:

    • 这种方法有效,但需要注意的是,如果 monoString 发出“原始”的时间比整个 fluxString 长,您将得到 "A B C Original"。 (但这里不可能,因为just 是同步评估的,所以zip 将有效地总是让monoStringcombinedString 之前完成)
    【解决方案2】:

    您需要将concatWithmonoStringfluxString 联系起来,并将reduceMono&lt;String&gt; 联系起来。

    【讨论】:

    • 这确实是一种更防火的方法,因为concat 将确保Original 总是在A,B,C 之前发出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2017-03-23
    • 2017-08-31
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    相关资源
    最近更新 更多