Java 8 Streams - 如何将列表中具有相同字段的元素合并到一个元素并求和

Mat*_*ley 3 java java-8 java-stream

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

class A {
String fieldA;
int fieldB
}
Run Code Online (Sandbox Code Playgroud)

我想将具有相同 fieldA 的所有元素合并到一个元素,并以这种方式汇总 fieldB 中的所有值:

el1 = AAA 5
el2 = AAA 7
el3 = AAA 2
Run Code Online (Sandbox Code Playgroud)

结果:

one element: AAA 14
Run Code Online (Sandbox Code Playgroud)

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

所以最后我的列表的元素必须比开始时少。我必须找到具有相同 fieldA 的所有元素,并将它们合并到具有求和 fieldB 的一个元素。

谢谢你!

Rav*_*ala 6

你可以这样做,

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());
Run Code Online (Sandbox Code Playgroud)

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