Java中按实体字段分组后,如何在响应中剔除该分组字段?
解决分组后Employee对象冗余department字段的问题
核心思路:创建一个不含department字段的新数据传输对象(DTO),在分组操作时将原EmployeesRecord转换为这个新DTO,从而消除冗余。
步骤1:定义新的无冗余字段的DTO
如果使用Java 16及以上版本,推荐用record实现简洁的不可变DTO:
public record EmployeeInfo(String name, String email) {}
若Java版本低于16,可使用普通类实现:
public class EmployeeInfo { private final String name; private final String email; public EmployeeInfo(String name, String email) { this.name = name; this.email = email; } public String getName() { return name; } public String getEmail() { return email; } }
步骤2:修改EmployeesDto的结构与转换逻辑
将原EmployeesDto中Map的value类型替换为新的EmployeeInfo,并在分组流程中添加对象转换逻辑:
public record EmployeesDto(Map<String, List<EmployeeInfo>> employeesRecordList) { public static EmployeesDto from(List<EmployeesRecord> data) { Map<String, List<EmployeeInfo>> mappedEmployees = data.stream() // 按department分组,同时指定下游收集器完成对象转换 .collect(Collectors.groupingBy( EmployeesRecord::getDepartment, Collectors.mapping( // 丢弃department字段,转换为新DTO emp -> new EmployeeInfo(emp.getName(), emp.getEmail()), Collectors.toList() ) )); return new EmployeesDto(mappedEmployees); } }
说明
这里利用Collectors.groupingBy的重载方法,通过第二个参数Collectors.mapping完成原对象到新DTO的转换,最终得到的响应结构中:
- Map的key为部门名称(
department) - 对应的列表仅包含员工姓名和邮箱,完全消除了冗余的
department字段
内容的提问来源于stack exchange,提问作者Rayan
相关产品推荐
相关产品推荐

