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

使用Java Streams API更新用户实体的代码重构优化问题

代码问题分析

  • 你这段代码执行了2次fetchUserByUserId查询,完全无意义,额外增加了数据库IO开销
  • map里修改查询到的用户实体后没有调用持久化方法(比如userRepository.save(u)),修改只会存在于内存中不会落库,你第二次查询拿到的还是未更新的旧数据
  • 直接调用get()如果查询结果为空会直接抛出NoSuchElementException,没有空值处理风险极高
  • 生产环境不建议用System.out打印日志,建议替换为项目对应的日志框架输出

重构后的代码

不需要二次查询,修改完实体持久化后直接返回即可,同时补充空值异常处理:

public User updateUser(int userId, User user){
    // 可替换为项目日志框架输出,比如log.info("User id is {}", userId);
    System.out.println("User id is "+ userId);
    return this.userRepository
            .fetchUserByUserId(userId)
            .map(existUser -> {
                // 注意:如果业务不允许修改userId,建议删除这行赋值,避免入参非法修改用户id
                existUser.setUserId(user.getUserId());
                existUser.setUsername(user.getUsername());
                existUser.setEmailAddress(user.getEmailAddress());
                // 持久化更新,若项目开启事务且当前方法在事务内,也可以省略save,事务提交会自动同步修改
                return userRepository.save(existUser);
            })
            // 可替换为项目自定义的业务异常
            .orElseThrow(() -> new RuntimeException("待更新用户不存在,id:" + userId));
}

优化点说明

  • 全程只执行1次查询,没有多余的数据库请求,性能更高
  • 补充了空值处理逻辑,用户不存在时抛出明确的业务异常,更便于问题排查
  • 所有修改直接落库,不会出现更新不生效的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:54:04