java中arraylist需用stream api的groupingby实现分组统计:单属性用groupingby+summingdouble;多属性用嵌套groupingby;保留对象列表用groupingby直接分组;自定义键支持价格区间、日期格式等灵活映射。

Java 中 ArrayList 本身不提供按属性分组统计的内置方法,需要借助 Java 8+ 的 Stream API 配合 Collectors 实现,核心是用 Collectors.groupingBy 和 Collectors.summingInt(或其他聚合器)组合完成。
使用 stream + groupingBy 按单个属性分组求和
假设有一个订单列表,需按商品类别(category)统计总金额:
List<order> orders = new ArrayList();
// 假设 Order 有 String category; double amount;
Map<string double> sumByCategory = orders.stream()
.collect(Collectors.groupingBy(
Order::getCategory,
Collectors.summingDouble(Order::getAmount)
));
</string></order>
说明:第一个参数指定分组键(如 getAttribute),第二个参数指定每组如何聚合(如求和、计数、平均值等)。
按多个属性联合分组(嵌套 groupingBy)
若需按“类别 + 状态”联合分组,可用嵌套 groupingBy:
Map<string map long>> countByCategoryAndStatus = orders.stream()
.collect(Collectors.groupingBy(
Order::getCategory,
Collectors.groupingBy(
Order::getStatus,
Collectors.counting()
)
));
</string>
结果是 MapAbstractMap.SimpleEntry 或自定义 Key 类做扁平化联合键。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
分组后保留完整对象列表(非聚合值)
有时只需归类,不立即聚合,比如按状态分组后分别处理各组数据:
Map<string list>> grouped = orders.stream()
.collect(Collectors.groupingBy(Order::getStatus));
// grouped.get("shipped") 返回所有已发货订单的 List
</string>
这是最轻量的分组方式,后续可对每个 List 单独调用 stream().mapToInt(...).sum() 等进一步计算。
自定义分组键(如按价格区间、日期月份)
分组函数可以是任意逻辑表达式,不局限于 getter:
- 按价格区间分组:
o -> o.getAmount() - 按年月分组(LocalDateTime):
o -> o.getDate().format(DateTimeFormatter.ofPattern("yyyy-MM")) - 忽略大小写分组:
o -> o.getCategory().toLowerCase()
关键是把原始对象映射为可比较、可哈希的键类型(String、Integer、LocalDate 等)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










