You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Mono<List<Advances>>直接映射为Mono<List<AdvancesDto>>避免索引越界

代码优化方案

优化后完整代码

public Mono<List<AdvancesDto>> findBySearchKeys(Map<String, String> paramsMap) {
    // 补充:原代码中tpNumber、vCode、arrivalNumber需从paramsMap中提取,此处保留原有调用逻辑
    return advanceRepo.findAllByKeys(tpNumber, vCode, arrivalNumber)
            .collectList()
            .map(advancesList -> advancesList.stream()
                    .map(Advances::dto)
                    .toList() // JDK16以下版本可替换为.collect(Collectors.toList())
            )
            .switchIfEmpty(Mono.error(new DataException(HttpStatus.NOT_FOUND, "Record/s Not Found")))
            .onErrorMap(error -> new DataException(HttpStatus.BAD_REQUEST, "Problem while fetching Data", error));
}

核心优化说明

  • 彻底规避索引越界风险:取消硬编码索引取元素的写法,通过Stream遍历所有查询返回的Advances对象,统一调用内置dto()方法完成转换,无论查询返回任意数量的结果都能正常处理。
  • 消除线程安全隐患:移除了方法作用域下的共享advDTOList变量,所有转换逻辑都在响应式流内部完成,避免非线程安全的ArrayList在异步场景下出现并发读写异常,符合响应式编程无状态设计规范。
  • 修正异常处理逻辑:原代码中doOnError属于副作用操作,仅能执行打印日志类操作,无法替换流中抛出的异常,改用onErrorMap可以正确把原始异常包装为自定义的DataException返回给调用方。

内容的提问来源于stack exchange,提问作者Puneet Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:54:00