Spring响应式:将Mono列表转换为Flux

6

我有一个

list.stream()
.map(element -> func());

在func()函数中使用Mono返回的结果,如何将这个由Mono<CustomObject>对象组成的列表转换为Flux<CustomObject>并从流中返回?


1
您可以查看此帖子https://dev59.com/O63la4cB1Zd3GeqPP6S3 - ilovemilk
3个回答

13
List<Mono<CustomObject >> monoList = new ArrayList<>();
monoList(object);

Flux<CustomObject> flux = Flux.concat(monoList);

4
你好vijay,你能在代码示例周围添加一些背景信息吗? - EtherDragon
1
Flux<CustomObject> != Flux<Mono<CustomObject>> - Hubidubi
1
请注释您的代码,以便您正在帮助的人可以理解代码的功能以及它如何解决他们的问题。 - RyanNerd
请注释您的代码,以便您想要帮助的人可以理解代码的作用以及如何解决他们的问题。 - RyanNerd
1
  1. Mono<SomeClass> 基本上是由源在给定时间点发出的数据项(顺序) 。monoList 是这样的 Monos 集合,其中列表包含由下游系统发出并添加到集合(在此情况下为 List)中的多个数据项。同样,可能会有一个或多个这样的源按顺序发出项目,这意味着存在多个 Mono<SomeClass> 列表。
  2. 将每个源组合起来,以形成所有数据项的连续流。 考虑:顺序订阅多个数据源还是急切地? a. concat:顺序 b. merge:急切
- vijay krishna

0
只需使用Flux.concat此处的文档)即可:
var yourCode = list.stream().map(element -> func());
var whatyouWant = Flux.concat(yourCode);

从文档中可以看到:
将提供的所有源连接在一起,将源发出的元素转发到下游。
所以基本上,`concat` 接受一个 `Publisher`(其中包括 `Mono`)的可迭代对象,并返回您想要的类型的 `Flux`。

0
如果你有一个将 List<T> 映射到 List<Mono<U>> 的操作,那么你可以将原始的 List<T> 转换为 Flux<T>,例如。
而不是:
List<T> entities = ArrayList<>();
List<Mono<U>> monos = entities.map (this::operationThatReturnsMono);

你可以做类似这样的事情:
List<T> entities = ArrayList<>();
Flux<U> flux = Flux.fromIterable(entities).flatMap(this::operationThatReturnsMono)

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