Spring响应式编程:如何将Flux<Object>转为Mono<ListOfDtos>?
解决方案
你可以通过Reactor提供的collectList()操作符将Flux<ObjectDto>转换为Mono<List<ObjectDto>>,再通过map()将列表映射为ListOfDtos实例,最终得到Mono<ListOfDtos>。
修改后的服务层方法如下:
public Mono<ListOfDtos> getAllObjectsByField(String field) { return Mono.just(field) .flatMapMany(fieldVal -> objectRepository.findByField(fieldVal)) .flatMap(ObjectMapper::toObjectDto) // 将Flux中的元素收集为List,包装成Mono .collectList() // 用收集到的List<ObjectDto>实例化ListOfDtos .map(ListOfDtos::new); }
关键步骤说明:
collectList():订阅上游Flux,收集所有元素到一个List中,当Flux完成时,返回包含该列表的Mono。map(ListOfDtos::new):利用ListOfDtos的构造方法ListOfDtos(List<ObjectDto> dtos),直接将List<ObjectDto>转换为目标DTO对象。
额外优化建议
如果ObjectMapper.toObjectDto()不需要异步操作(比如只是简单属性拷贝,无IO或其他异步逻辑),建议将其改为同步方法,返回ObjectDto而非Mono<ObjectDto>,这样可以把flatMap换成map,减少不必要的Mono包装开销:
// 修改映射器方法 public static ObjectDto toObjectDto(Object object) { return new ObjectDto(object.getField1(), object.getField2(), ...); } // 服务层方法改用map public Mono<ListOfDtos> getAllObjectsByField(String field) { return Mono.just(field) .flatMapMany(objectRepository::findByField) .map(ObjectMapper::toObjectDto) .collectList() .map(ListOfDtos::new); }
内容的提问来源于stack exchange,提问作者Helen Barskaya
相关产品推荐
相关产品推荐

