如何将Mono<Map<Integer, Project>>转换为Flux<Project>?
解决方案
核心问题分析
你原来的代码有两个关键错误:
- 直接对
Mono调用toStream()破坏了响应式流的特性,且后续将Collection<Project>强转为Flux<Project>属于类型不兼容的错误,必然失败。 - 输入本身已是
Mono<Map<Integer, Project>>,其中Map的键是唯一项目ID,无需再次调用Collectors.toMap做合并操作(如果你的合并逻辑是针对其他场景,可参考下方扩展方案)。
基础转换代码
如果只是单纯将Mono<Map<Integer, Project>>的Map值转换为Flux<Project>,直接使用Reactor的响应式操作符即可:
Flux<Project> projectFluxReturn = result.flatMapMany(map -> Flux.fromIterable(map.values()));
flatMapMany:将Mono中的Map对象转换为Flux流Flux.fromIterable:把Map的values集合(Collection<Project>)转换为响应式流
扩展:如果需要合并相同ID的Project任务列表
如果你的原始数据其实是Flux<Project>(而非已经是Map的Mono),需要先合并相同ID的Project的任务列表再转成最终Flux,可按以下方式实现:
// 假设原始数据是Flux<Project> Flux<Project> mergedProjectFlux = originalProjectFlux // 按项目ID分组合并,相同ID的Project合并任务列表 .collectMap( Project::getProjectId, Function.identity(), (project1, project2) -> { project1.getTaskList().addAll(project2.getTaskList()); project2.getTaskList().clear(); return project1; } ) // 将合并后的Map转换为Flux .flatMapMany(map -> Flux.fromIterable(map.values()));
内容的提问来源于stack exchange,提问作者Sujoy
相关产品推荐
相关产品推荐

