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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:54:05