java - JAVA List GroupBy 多个字段和 Sum
问题描述
我有包含名称、货币和金额字段的列表。我想按名称、货币和金额总和对其进行分组。
List<myPojo> rows= ................
public class myPojo
{
private String name;
private String currency;
private BigDecimal amount;
......................
}
我想要列表中的结果/输出
解决方案
您可以使用流 API。使用Collectors.toMap
和AbstractMap.SimpleEntry
用作地图的关键。然后为同一个键的多个值定义合并函数。
List<myPojo> res = new ArrayList<>(rows.stream()
.collect(Collectors.toMap(
e -> new AbstractMap.SimpleEntry<>(e.getName(), e.getCurrency()),
Function.identity(),
(a, b) -> new myPojo(a.getName(), a.getCurrency(), a.getAmount().add(b.getAmount()))))
.values());
演示:
List<myPojo> list = new ArrayList<>();
list.add(new myPojo("A", "USD", new BigDecimal(1.0)));
list.add(new myPojo("A", "USD", new BigDecimal(2.0)));
list.add(new myPojo("A", "USD", new BigDecimal(3.0)));
list.add(new myPojo("B", "USD", new BigDecimal(1.0)));
list.add(new myPojo("B", "USD", new BigDecimal(2.0)));
list.add(new myPojo("B", "USD", new BigDecimal(3.0)));
list.add(new myPojo("A", "US", new BigDecimal(1.0)));
list.add(new myPojo("A", "US", new BigDecimal(2.0)));
list.add(new myPojo("A", "US", new BigDecimal(3.0)));
List<myPojo> res = new ArrayList<>(list.stream()
.collect(Collectors.toMap(
e -> new AbstractMap.SimpleEntry<>(e.getName(), e.getCurrency()),
Function.identity(),
(a, b) -> new myPojo(a.getName(), a.getCurrency(), a.getAmount().add(b.getAmount()))))
.values());
System.out.println(res.toString());
输出:
[myPojo [name=B, currency=USD, amount=6],
myPojo [name=A, currency=USD, amount=6],
myPojo [name=A, currency=US, amount=6]]
注意:MyPojo
为了更好的约定,尽量将类名大写
推荐阅读
- c - 当客户端地址来自数组时,UNIX 域数据报套接字阻塞
- python - 使用 buildozer 在 android 上部署 kivy 应用程序时出错
- sql - 为什么这些嵌套子查询的过滤器范围之间没有任何区别
- gdb - 在二进制文件中查找符号大小
- sql - 合计一列,除以对应的值
- python - Python字典打印的值与单独打印的值不同
- robotframework - TypeError:预期的参数 1 是一个列表或类似列表,而是得到了字符串。机器人框架工作
- sass - 新 SASS 模块中的正确语法:@use 而不是 @import
- drake - 是否可以在 Drake 中的动态模型上进行 MPC,完全或部分由神经网络描述?
- javascript - 在电子中使用来自 tensorflow.js 的posenet