Java中用Lambda表达式做集合统计的核心是Stream API与函数式操作结合,支持filter+count计数、mapToInt+sum等求值、groupingBy+counting分组统计、summarizingInt等多指标聚合。

Java 中用 Lambda 表达式做集合统计,核心是结合 Stream API 和函数式操作,写法简洁、逻辑清晰。不需要手动循环或维护计数器,一行流式调用就能完成常见统计任务。
统计满足条件的元素个数
最常用场景:查有多少个元素符合某个规则(比如“年龄大于18”“状态为ACTIVE”)。关键在于 filter() + count():
- 先用
stream()把集合转成流 - 再用
filter(条件Lambda)筛出目标元素 - 最后调
count()得到long类型结果
例如统计 List 中偶数个数:
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6);long evenCount = nums.stream().filter(n -> n % 2 == 0).count(); // 返回 3
对数值字段求和、平均值、最值
这类操作需先映射为基本类型流(如 mapToInt),才能调用对应终端方法:
立即学习“Java免费学习笔记(深入)”;
-
sum():直接返回int/long/double -
average():返回OptionalDouble,需判空再取值 -
max()/min():返回OptionalInt等,同样要防空指针
示例(对对象列表中 price 字段求和):
List<Product> products = ...;int total = products.stream().mapToInt(p -> p.getPrice()).sum();
按类别分组并统计频次
想算“每种水果各出现几次”“每个部门有多少员工”,用 Collectors.groupingBy() 配合 Collectors.counting():
- 第一个参数是分组键的 Lambda(如
p -> p.getCategory()) - 第二个参数指定聚合方式,
counting()就是计数 - 结果是
Map<K, Long>,键为分组值,值为出现次数
例如统计字符串列表中各单词频次:
Map<String, Long> freq = words.stream().collect(Collectors.groupingBy(w -> w, Collectors.counting()));
多字段聚合或自定义统计
如果要同时算总和、平均值、最大最小值,或按多个条件分组,可用 Collectors.summarizingInt/Long/Double:
- 返回
IntSummaryStatistics等对象,含getSum()、getAverage()、getMax()等方法 - 支持链式调用,避免多次遍历流
例如一次性获取价格的汇总信息:
IntSummaryStatistics stats = products.stream().mapToInt(Product::getPrice)
.summaryStatistics();
System.out.println("总和:" + stats.getSum());
System.out.println("平均:" + stats.getAverage());


















