java – 在ArrayList中合并对象的高效算法

我有一个自定义对象的ArrayList(DTO),DTO的结构:

private String id;
private String text;
private String query;
private String locatorId;
private Collection<String> categories;
private Collection<String> triggers;

我有两个任务:

>删除数组中的重复项(看起来没问题,我应该使用HashSet)
>使用相同的id字段在ArrayList中查找对象,并将它们合并为一个对象(我应合并字段类别和触发器),并使用合并对象创建最终List.

这项任务最有效的方法是什么?我也很有兴趣在我的算法中使用Lambda表达式.

最佳答案
使用流API通过指定键合并对象非常容易.首先,在您的Entity类中定义一个合并方法,如下所示:

public Entity merge(Entity other) {
    this.categories.addAll(other.categories);
    this.triggers.addAll(other.triggers);
    return this;
}

然后,您可以构建自定义分组收集器:

import static java.util.stream.Collectors.*;

public static Collection<Entity> mergeAll(Collection<Entity> input) {
    return input.stream()
                .collect(groupingBy(Entity::getId,
                    collectingAndThen(reducing(Entity::merge), Optional::get)))
                .values();
}

这里我们通过getId方法的结果对Entity元素进行分组,而下游收集器只在遇到相同的id时调用Entity.merge()(我们需要另外展开Optional).此解决方案中的实体不需要特殊的hashCode()或equals()实现.

请注意,此解决方案会修改现有的未合并的Entity对象.如果不合需要,请在merge()方法中创建一个新实体并返回它(如@ Marco13答案中所述).

转载注明原文:java – 在ArrayList中合并对象的高效算法 - 代码日志