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

如何在同一类的另一个方法中复用某方法的部分代码(不新增方法)

不新增方法前提下简化重复代码的方案

在同一个类中存在两个方法,均包含一段重复的角色实体转换为字符串列表的代码,要求在不新增方法的前提下消除代码重复。

两个方法的代码如下:

第一个方法(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());

解决方案

可以通过定义类级别的函数式变量来封装这段重复的转换逻辑,具体步骤如下:

  1. 在类中添加一个私有的、不可变的Function变量,封装角色列表的转换逻辑:
private final Function<List<RoleEntity>, List<String>> ROLE_CONVERTER = 
    roles -> roles.stream()
                 .map(RoleEntity::getId)
                 .map(String::valueOf)
                 .collect(Collectors.toList());
  1. 修改第一个方法中的重复代码,调用该变量的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;
}
  1. 修改第二个方法中的重复代码,同样调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:05:31