Java:如何合并列表中ID相同的SampleObject对象?
合并同ID的SampleObject对象列表
你定义了如下自定义类型:
public class SampleObject { private UUID id; private List<ValueObject> values; // getters, all-args constructor, etc. }
其中ValueObject仅包含若干字符串。你有一个SampleObject类型的列表payload,列表中存在多个id相同但values列表内容不同的对象,需要合并所有同id的对象,将它们的ValueObject列表整合到一个对象中,最终得到新的SampleObject列表。
你已经尝试使用Collectors.groupingBy分组:
List<SampleObject> payload = // initializing the List payload.stream().collect(Collectors.groupingBy(SampleObject::getId));
但返回的是Map<UUID, List<SampleObject>>,不知道如何合并Map值中的对象。
解决方案
方法一:使用Collectors.toMap直接合并
通过toMap的合并函数,在收集过程中直接完成同id对象的values合并,无需额外处理Map:
List<SampleObject> mergedList = payload.stream() .collect(Collectors.toMap( SampleObject::getId, obj -> obj, (existing, newObj) -> { // 合并两个对象的values列表 List<ValueObject> combined = new ArrayList<>(existing.getValues()); combined.addAll(newObj.getValues()); // 用全参构造器创建新的合并对象 return new SampleObject(existing.getId(), combined); } )) .values() .stream() .collect(Collectors.toList());
方法二:先分组再合并Map条目
如果坚持使用groupingBy分组,可遍历Map的entry,对每个分组内的对象进行values合并:
Map<UUID, List<SampleObject>> groupedMap = payload.stream() .collect(Collectors.groupingBy(SampleObject::getId)); List<SampleObject> mergedList = groupedMap.entrySet().stream() .map(entry -> { UUID id = entry.getKey(); // 扁平化所有分组内的values并收集为一个列表 List<ValueObject> combinedValues = entry.getValue().stream() .flatMap(obj -> obj.getValues().stream()) .collect(Collectors.toList()); return new SampleObject(id, combinedValues); }) .collect(Collectors.toList());
注意事项
- 若需要对
ValueObject去重,可在flatMap后添加.distinct(),但需确保ValueObject重写了equals()和hashCode()方法。 - 示例中通过创建新
SampleObject完成合并,避免修改原对象产生副作用;若类设计允许修改,也可直接向现有对象的values列表中添加元素,但不推荐在流操作中修改外部状态。
内容的提问来源于stack exchange,提问作者noob123
相关产品推荐
相关产品推荐

