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

如何按属性合并Java对象列表 去重名称并聚合同名称type为列表

前置说明

你定义的原实体类名Object和Java顶层基类java.lang.Object重名,实际编码时建议重命名避免冲突,下文统一将原实体类改为BizObject演示,所有实体类默认已编写对应getter、构造方法。

Stream 实现方案(JDK8+推荐)

// 数据库查询得到的原始列表
List<BizObject> originList = yourMapper.selectList(queryWrapper);

// 核心转换逻辑
List<NewObject> result = originList.stream()
    // 按name分组,同时归集对应name的所有type为列表
    .collect(Collectors.groupingBy(
        BizObject::getName,
        Collectors.mapping(BizObject::getType, Collectors.toList())
    ))
    // 把分组结果转换为NewObject集合
    .entrySet()
    .stream()
    .map(entry -> new NewObject(entry.getKey(), entry.getValue()))
    .collect(Collectors.toList());

普通遍历实现方案

List<BizObject> originList = yourMapper.selectList(queryWrapper);
Map<String, List<String>> nameTypeMap = new HashMap<>();

// 遍历原始数据归集type
for (BizObject item : originList) {
    nameTypeMap.computeIfAbsent(item.getName(), k -> new ArrayList<>())
               .add(item.getType());
}

// 转换为目标对象列表
List<NewObject> result = new ArrayList<>();
for (Map.Entry<String, List<String>> entry : nameTypeMap.entrySet()) {
    result.add(new NewObject(entry.getKey(), entry.getValue()));
}

可选优化配置

  • 如需对同一name下的type去重,可将归集type的Collectors.toList()替换为:
    Collectors.collectingAndThen(Collectors.toList(), 
        list -> list.stream().distinct().collect(Collectors.toList()))
    
  • 如需保持name的顺序和原始列表出现顺序一致,可在groupingBy中指定有序Map构造函数:
    Collectors.groupingBy(
        BizObject::getName,
        LinkedHashMap::new,
        Collectors.mapping(BizObject::getType, Collectors.toList())
    )
    

内容的提问来源于stack exchange,提问作者Conor606

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:39:02