使用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
相关产品推荐
相关产品推荐

