java - 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 的元素。
谢谢!
解决方案
你可以这样做,
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
从每个条目创建一个新实例并将其收集到一个容器中。这就是我们需要的。
推荐阅读
- android - 有时在 android studio 中未正确接收 Socket 数据
- reactjs - 如何在反应导航抽屉中添加多个分隔器组件
- swift - 如何触发在 .reality 文件中声明的实体动画
- python - sklearn 光学问题达到预期结果
- javascript - Joi 验证 - 不允许空对象
- php - Laravel 8 子文件夹内的控制器问题
- node.js - 如何修复节点中的“发送到客户端后无法设置标头”错误?
- javascript - 我的 javascript 代码中的错误代码“Uncaught TypeError: Cannot read property 'style' of null”
- java - 如何在android应用程序中从uberjar调用clojure代码
- java - ISO消息表示,JPOS中“pack”方法中的有线行为