如何在同一类的另一个方法中复用某方法的部分代码(不新增方法)
不新增方法前提下简化重复代码的方案
在同一个类中存在两个方法,均包含一段重复的角色实体转换为字符串列表的代码,要求在不新增方法的前提下消除代码重复。
两个方法的代码如下:
第一个方法(map):
protected UserDTO map(UserEntity entity) { var result = new UserDTO(); var userRoles = entity.getRoles().stream() .map(RoleEntity::getId) .map(String::valueOf) .collect(Collectors.toList()); result.setId(entity.getId().toString()); result.setLastAccessDate(entity.getLastAccessDate()); result.setRoles(userRoles); if (entity.getEmail() != null) { var email = new UserDTO.Email(entity.getEmail(), EMAIL_TYPE); result.setEmails(List.of(email)); } return result; }
第二个方法(updateUser):
public UserResource updateUser(String id, UserResource updatedUser) { var optionalUser = userRepository.findById(Integer.valueOf(updatedUser.getUserName())); updatedUser.setRoles(optionalUser.get().getRoles() .stream() .map(RoleEntity::getId) .map(String::valueOf) .collect(Collectors.toList())); updatedUser.setLastAccessDate(optionalUser.get().getLastAccessDate()); var entity = mapToUserEntity(updatedUser); userRepository.save(entity); return updatedUser; }
重复的代码段为:
.getRoles() .stream() .map(RoleEntity::getId) .map(String::valueOf) .collect(Collectors.toList());
解决方案
可以通过定义类级别的函数式变量来封装这段重复的转换逻辑,具体步骤如下:
- 在类中添加一个私有的、不可变的
Function变量,封装角色列表的转换逻辑:
private final Function<List<RoleEntity>, List<String>> ROLE_CONVERTER = roles -> roles.stream() .map(RoleEntity::getId) .map(String::valueOf) .collect(Collectors.toList());
- 修改第一个方法中的重复代码,调用该变量的
apply方法:
protected UserDTO map(UserEntity entity) { var result = new UserDTO(); var userRoles = ROLE_CONVERTER.apply(entity.getRoles()); result.setId(entity.getId().toString()); result.setLastAccessDate(entity.getLastAccessDate()); result.setRoles(userRoles); if (entity.getEmail() != null) { var email = new UserDTO.Email(entity.getEmail(), EMAIL_TYPE); result.setEmails(List.of(email)); } return result; }
- 修改第二个方法中的重复代码,同样调用
apply方法:
public UserResource updateUser(String id, UserResource updatedUser) { var optionalUser = userRepository.findById(Integer.valueOf(updatedUser.getUserName())); updatedUser.setRoles(ROLE_CONVERTER.apply(optionalUser.get().getRoles())); updatedUser.setLastAccessDate(optionalUser.get().getLastAccessDate()); var entity = mapToUserEntity(updatedUser); userRepository.save(entity); return updatedUser; }
方案说明
- 利用Java的函数式接口
Function,将重复的流操作逻辑封装为一个可复用的变量,避免了代码复制。 - 该变量属于类级别,初始化一次后可在类内所有方法中调用,完全符合“不新增方法”的要求。
- 变量名
ROLE_CONVERTER清晰表达了转换逻辑的意图,保持了代码的可读性。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

