将 List<Mono<String>> 转换为 Flux<String>

5

有几个问题,但答案非常特定于某些代码。

通常,如何将 Mono 的 Stream 转换为 Flux

List<Mono<String> listOfMono = stream()
.map( s -> { do something and return Mono<String> } )
.collect(Collectors.toList());

如何将listOfMono对象转换为Flux<String>
3个回答

4
你可以使用 fromIterable 然后使用 flatMap 来异步转换这个 Flux 发出的元素到 Publishers 上,然后通过合并来将这些内部 Publishers 扁平化成一个单一的 Flux,从而允许它们相互交错。
Flux<String> result = Flux.fromIterable(listOfMono)
            .flatMap(Function.identity());

有没有一种内联解决方案,可以继续管道而不是将其提取到变量中? - madhairsilence
在流式处理列表之前,你能告诉我输入集合是什么吗?我的意思是,在更改为 Mono<String> 之前。@madhairsilence - Ryuzaki L

3
如果您的输入是 Monos 列表,那么简单地执行以下操作即可:
Flux.merge(listOfMono);

如果你的输入是流,你可以选择以下两种方式:
stream()
   .map( s -> { do something and return Mono<String> } )
   .collect(Collectors.collectingAndThen(Collectors.toList(), Flux::merge));

或者

Flux.fromStream(stream())
    .flatMap( s -> { do something and return Mono<String> } )

我个人更喜欢最后一种选择,因为那是最简单和最通俗易懂的。


很好知道 Flux.merge - Ryuzaki L

1

你也可以使用 concat。

Flux.concat(listOfMono);

在 concat 中,顺序始终保持不变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接