首页 > 解决方案 > Java 8 Streams - 如何将列表中具有相同字段的元素合并为一个元素并总结

问题描述

我有一个问题 - 我有元素列表 A:

class A {
String fieldA;
int fieldB
}

我想将所有具有相同字段 A 的元素合并为一个元素,并以这种方式汇总字段 B 中的所有值:

el1 = AAA 5
el2 = AAA 7
el3 = AAA 2

结果:

one element: AAA 14

如何使用 Java 8 Streams 做到这一点?

所以最后我的列表必须比开始时包含更少的元素。我必须找到具有相同字段 A 的所有元素,并将它们合并为一个带有汇总字段 B 的元素。

谢谢!

标签: javajava-8java-stream

解决方案


你可以这样做,

List<A> reducedAList = aList.stream()
    .collect(Collectors.groupingBy(A::getFieldA, Collectors.summingInt(A::getFieldB)))
    .entrySet().stream()
    .map(e -> new A(e.getKey(), e.getValue()))
    .collect(Collectors.toList());

与其替换现有的,不如List<A>让我们用减少的 A 值创建一个新列表。为此,首先创建一个map考虑 fieldA 的值作为键和 fieldB 值的总和,其键与值相同。然后遍历 map 的 entrySet 并A从每个条目创建一个新实例并将其收集到一个容器中。这就是我们需要的。


推荐阅读