我有一个问题 - 我有元素列表 A:
class A {
String fieldA;
int fieldB
}
我想将具有相同 fieldA 的所有元素合并为一个元素,并以这种方式对 fieldB 的所有值求和:
el1 = AAA 5
el2 = AAA 7
el3 = AAA 2
结果:
one element: AAA 14
如何使用 Java 8 Streams 执行此操作?
所以最后我的列表中的元素必须比开始时少。 我必须找到具有相同 fieldA 的所有元素,并将它们合并到一个元素中,并将 fieldB 相加。
谢谢!
最佳答案
你可以这样做,
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
从每个条目中提取实例并将其收集到容器中。这就是我们所需要的。
关于Java 8 Streams - 如何将具有相同字段的列表中的元素合并为一个元素并总结,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52870578/