Java 8 Streams - 如何将具有相同字段的列表中的元素合并为一个元素并总结

标签 java java-8 java-stream

我有一个问题 - 我有元素列表 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/

相关文章:

java - MapFragment - 应用程序可能在其主线程上做了太多工作

Java 8 Lambda - 分组和减少对象

java - 未返回 dateTimeFormatter 短时区名称

Java ForkJoinPool 线程未完成

java - 从java中的 map 中检索有序列表

java - 使用 src/main 和 src/test 运行测试时出现问题

Java - 什么可以使这段代码运行得更快?

java - 有没有更快的算法来构造这个图的邻接表?

java 8 在使用 Collectors.toMap 时处理自定义异常

java - 一个 Stream 是否可以顺序处理一部分流水线,然后并行处理?