Java8如何将InscricaoTipoTrabalhoAvaliador列表按AvaliadorEvento分组转DTO
Java 8 按AvaliadorEvento分组封装DTO实现方案
实现逻辑
核心是借助Java 8 Stream API的Collectors.groupingBy分组能力,先将实体列表按同一AvaliadorEvento分组,再将分组结果转换为目标DTO对象。
推荐优先按AvaliadorEvento的主键ID分组,避免因实体未重写equals()、hashCode()或者代理对象导致的分组错误问题,实现代码如下:
import java.util.Objects; import java.util.List; import java.util.stream.Collectors; // 1. 拿到数据库查询返回的实体列表 List<InscricaoTipoTrabalhoAvaliador> entityList = yourRepository.findAll(); // 2. 按AvaliadorEvento的ID分组并转换为DTO List<InscricaoTipoTrabalhoAvaliadorDTO> dtoList = entityList.stream() // 过滤AvaliadorEvento为空的无效数据,可根据业务需求调整 .filter(entity -> Objects.nonNull(entity.getAvaliadorEvento()) && Objects.nonNull(entity.getAvaliadorEvento().getId())) // 按avaliadorEventoId分组 .collect(Collectors.groupingBy(entity -> entity.getAvaliadorEvento().getId())) // 分组结果转换为DTO .values().stream() .map(group -> new InscricaoTipoTrabalhoAvaliadorDTO( // 同一组的AvaliadorEvento完全相同,取第一条即可 group.get(0).getAvaliadorEvento(), group )) .collect(Collectors.toList());
注意事项
- 若你的
AvaliadorEvento实体已经正确重写了equals()和hashCode()方法,也可以直接按AvaliadorEvento对象分组,分组器替换为Collectors.groupingBy(InscricaoTipoTrabalhoAvaliador::getAvaliadorEvento)即可 - 若
AvaliadorEvento配置为懒加载,需要确保DTO转换时Session未关闭,或者在查询实体时使用fetch join提前加载AvaliadorEvento关联属性,避免懒加载异常 - 可根据业务需要在stream处理中添加排序、字段过滤等逻辑,调整最终返回的DTO内容
内容的提问来源于stack exchange,提问作者Romeu Fernandes Bessa
相关产品推荐
相关产品推荐

