collectors.counting() 是 java stream api 中统计元素个数的收集器,返回 long 类型计数值,等价于 summinglong(e -> 1l);支持直接计数、配合 filter 筛选计数及与 groupingby 联用实现分组统计,返回 map,注意其与 stream.count() 的语义区别。

Collectors.counting() 是 Java Stream API 中用于统计流中元素个数的专用收集器,它返回一个 long 类型的计数值,内部等价于 Collectors.summingLong(e -> 1L)。
基本用法:直接统计流中所有元素数量
适用于无需过滤、映射,只关心“一共有多少个”的场景:
- 对集合、数组或任意可转换为 Stream 的数据源调用
stream().collect(Collectors.counting()) - 结果类型为
Long,需注意空流返回0L
List<string> list = Arrays.asList("a", "b", "c");
long count = list.stream().collect(Collectors.counting()); // 结果:3L</string>
配合 filter 使用:统计满足条件的元素个数
先用 filter 筛选,再用 counting() 统计,比先 filter 再 count() 更符合函数式风格(且可复用在复杂收集逻辑中):
- 避免多次遍历:filter + counting 在一次终端操作中完成
- 适合嵌入到更复杂的
collect调用中(如分组后统计)
List<integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
long evenCount = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.counting()); // 结果:2L</integer>
在 groupingBy 中统计分组内元素数量
这是 counting() 最典型的进阶用法,常与 groupingBy 搭配,替代手动计数:
- 按某个属性分组,并统计每组元素个数
- 返回
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>
注意事项与常见误区
-
counting()返回Long,不是int;大数据量时不会溢出,但若确定数量小且需int,可显式转型:.mapToInt(x -> 1).sum() - 不要和
Stream.count()混淆:count()是终端操作,返回long;counting()是收集器,用于collect(),支持组合(如分组、多级统计) - 空流、null 元素不影响 counting —— 它只数“流中经过的元素”,不校验内容是否为 null
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











