collectors.counting() 是 java 8 stream api 中返回 long 类型元素计数的收集器,用于全量统计、filter 条件计数及 groupingby 分组计数,注意接收类型为 long、空流结果为 0l,且适用于嵌套收集场景。

Collectors.counting() 是 Java 8 Stream API 中一个专门用于统计流中元素个数的收集器,它返回一个 long 类型的计数值,本质是调用 count() 方法的函数式封装。
基本用法:统计全部元素数量
最常见场景是对整个流做计数,无需过滤或分组,直接配合 collect() 使用:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 对集合、数组等数据源创建流后调用
collect(Collectors.counting()) - 结果类型为
Long,不是int,注意接收变量类型
List<string> list = Arrays.asList("a", "b", "c", "a");
long count = list.stream().collect(Collectors.counting()); // 结果:4</string>
配合 filter 统计满足条件的元素
它常与 filter() 链式调用,实现条件计数(类似 SQL 的 COUNT WHERE):
- 先用
filter()筛选,再用counting()计数,逻辑清晰且高效 - 比先
filter().toList()再size()更省内存,不生成中间集合
List<integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6);
long evenCount = nums.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.counting()); // 结果:3</integer>
在 groupingBy 中统计分组数量
与 Collectors.groupingBy() 结合,可按某属性分组并统计每组元素个数(类似 SQL 的 GROUP BY ... COUNT(*)):
- 第二个参数传入
Collectors.counting(),作为下游收集器 - 返回
Map<k long></k>,键为分组依据,值为该组元素数量
record Person(String name, int age) {}
List<person> people = List.of(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 30)
);
Map<integer long> countByAge = people.stream()
.collect(Collectors.groupingBy(Person::age, Collectors.counting()));
// 结果:{25=1, 30=2}</integer></person>
注意事项
- 返回值是
Long,避免用int接收导致编译错误或隐式截断 - 空流(如
Stream.empty())调用后结果为0L - 不能直接用于并行流的“累加合并”逻辑(它本身是并发安全的,但需确保上游流支持并行)
- 若只需总数,
stream.count()更简洁;counting()的优势在于能嵌入复杂收集逻辑(如分组、多级聚合)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










