如何按属性合并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
相关产品推荐
相关产品推荐

