java 合并/聚合列表中的对象

mitkmikd  于 2022-12-17  发布在  Java
关注(0)|答案(1)|浏览(162)

我有一个自定义类型,看起来像这样:

public class SampleObject {
    private UUID id;
    private List<ValueObject> values;
    
    // getters, all-args constructor, etc.
}

ValueObject只包含一些字符串。
我有一个ListSampleObject s payload,在这个列表中,有几个对象有相同的id,但是List<ValueObject>中的值不同。
我想要归档的是合并具有相同id的所有对象,并将ValueObject的所有不同列表添加到一个合并对象中。
最后,我再次需要SampleObject的列表。
我尝试了以下方法:

List<SampleObject> payload = // initializing the List

payload.stream().collect(Collectors.groupingBy(SampleObject::getId));

但是这会返回一个MapListSampleObject s,我不知道如何合并这个Map值下的对象。

g6ll5ycj

g6ll5ycj1#

一个月

为了将对应于同一个id的所有ValueObject合并在一起并存储到一个列表中,您可以使用收集器flatMapping(),它需要一个从元素生成流的 * 函数 类似于 * flatMap() * 操作 *)和一个下游收集器,后者告诉您需要如何存储由 * 函数 * 生成的新元素。
集合器groupingBy()flatMapping()的组合会给予你一个类型为Map<UUID, List<ValueObject>>的Map。要从中产生SampleObjectList,你可以创建一个流Map条目,将每个条目转换成SampleObject,然后将元素收集到一个List中。
这就是实现的样子:

List<SampleObject> payload = // initializing the list
    
List<SampleObject> mergedData = payload.stream()
    .collect(Collectors.groupingBy( // intermediate Map<UUID, List<ValueObject>>
        SampleObject::getId,
        Collectors.flatMapping(
            sampleObject -> sampleObject.getValues().stream(),
            Collectors.toList()
        )
    ))
    .entrySet().stream()
    .map(entry -> new SampleObject(entry.getKey(), entry.getValue()))
    .toList(); // for Java 16+ or collect(Collectors.toList())

相关问题