我有一个物品 list ,里面有物品 list .对象项包含文章.本文连接到另一个命名对象,该对象存储为具有下一个 struct 的db表:

Article ProductGroup
------- ------------
010101  Telephone
040444  Computer

我将我的事务列表解析为具有以下属性的对象统计:payBillNumberproductGroupamountOfItemssumPriceOfItems.现在,Stat人的名单如下所示:

BillNumber ProductGroup NumberOfItemsInBill SummaryItemsCostInBill
---------- ------------ ------------------- ----------------------
1          Telephone    1                   1000
1          Computer     1                   200
1          Telephone    2                   2000
1          Computer     1                   200
2          Accessories  1                   1500

如何使用以下视图将此List<Stat>折叠为新的List<Stat>:

BillNumber ProductGroup NumberOfItemsInBill SummaryItemsCostInBill
---------- ------------ ------------------- ----------------------
    1          Telephone    3                   3000
    1          Computer     2                   400
    2          Accessories  1                   1500

我希望我的数据按BillNumber和ProductGroup进行分组,金额为价格总和.可以不创建新 map 吗?

推荐答案

我提出了一个涉及中间 map 的解决方案,但以功能性的方式使用groupingByreducing:

List<Stat> collect = stats.stream()
    .collect(Collectors.groupingBy(Stat::getBillNumber, Collectors.groupingBy(Stat::getProductGroup,
            Collectors.reducing((left, right) -> new Stat(
                    left.getBillNumber(), 
                    left.getProductGroup(), 
                    left.getNumberOfItemsInBill() + right.getNumberOfItemsInBill(),
                    left.getSummaryItemsCostInBill() + right.getSummaryItemsCostInBill()
            )))))
    .values().stream()
    .flatMap(m -> m.values().stream())
    .filter(Optional::isPresent)
    .map(Optional::get)
    .collect(Collectors.toList());

请注意,这会导致创建大量Stat个对象.如果性能是一个问题,你可以想出一些聚合器,使用Collectors.of而不是Collectors.reducing,或者坚持使用reducing并在最后映射它.

Java相关问答推荐

是否有一种格式模式,可以在除0之外的数字前面有正负符号?

转换为Biggram

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

参数值[...]与预期类型java.util.Date不匹配

无法处理批处理侦听器中的反序列化异常

对运行在GraalVM-21上的JavaFX应用程序使用分代ZGC会警告不支持JVMCI,为什么?

JavaFX如何在MeshView中修复多个立方体?

Spark忽略Iceberg Nessie目录

查找剩余的枚举

放气总是压缩整个街区吗?

如何仅使用键/ID的一部分(组合)高效地返回映射值?

如何在太阳系模拟器中添加月球?

如何在透视表中添加对计数列的筛选?

Android Studio模拟器没有互联网

如何在不作为类出现的表上执行原生查询?

如何在Java中的重写方法参数中强制(Enum)接口实现?

如何在Spring Boot Auth服务器上正确配置CORS?

Java递归泛型是否可以被视为继承和重写的语法糖

如何修复Spring Boot应用程序中的RestDocumentationGenerationException:java.io.FileNotFoundException:/curl-request.adoc(只读文件系统)?

Vaadin Flow:设置密码显示按钮属性