【发布时间】:2020-07-31 20:22:25
【问题描述】:
我目前正在从事一个涉及一些反应式编程的项目。
我有 4 个不同的响应式存储库,分别从中获得 4 个不同的 Mono<List<SomeType>> 作为回报。
目标是将它们组合成一个Mono<List<GeneralType>>,以便将其合并到自定义响应中,以在ResponseEntity.ok() 中返回。我已经创建了一个GeneralType,并且成功地转换了一个Mono<List<SomeType>>,但是,没有进一步的进展。
所有存储库都有相似的签名:
public Mono<List<SomeType>> findAllByUserId(UUID userId)
我的响应中将所有不同列表合并为一个的字段:
private Mono<List<GeneralType>> items;
到目前为止我的方法是什么样的:
public Mono<List<GeneralType>> combineMonos(UUID userId) {
Mono<List<GeneralType>> combo1 = reactiveRepository.findAllByUserId(userId)
.map(list -> list.stream()
.map(GeneralType::new)
.collect(Collectors.toList()));
return combo1; // works just fine
}
所有其他列表都有几乎相同的方法,但是将它们放在一个单一的 Mono 中是一个问题。
我尝试了以下方法:
return Flux.merge(combo1.flatMapMany(Flux::fromIterable), combo2.flatMapMany(Flux::fromIterable)).collectList();
但是,IDE 敦促将返回类型更改为Flux<Object>。
此外,有些列表可能是空的,所以我不确定zip() 是否是这里的一个选项。我已经读过,如果至少有一个结果为空,它会将所有内容都返回为 empty。
所以问题是如何在没有 block() 无处不在的情况下以有效的方式完成?
【问题讨论】:
-
空单声道与空列表单声道不同。如果 mono 的值为空列表,则可以继续
zip。但是如果单声道有空值,它就不能继续zip。您可以尝试zip()运算符将所有Mono合并为一个。 -
@shafayathossain 非常感谢您的澄清!我有一种感觉,我在某个地方误解了一些东西......
标签: java reactive-programming project-reactor