count() 是 java stream 统计元素总数最直接高效的标准终端操作,返回 long 类型个数;它必须遍历全部元素,不支持短路,对无限流会阻塞,且调用后流关闭不可复用。

在 Java 中,使用 Stream 统计元素总数最直接、高效的方式是调用 count() 方法 —— 它是 Stream 接口定义的**终端操作**,返回 long 类型的元素个数。
count() 是最简洁的标准方式
count() 内部会遍历流并累加计数,无需手动写循环或收集到集合再取 size。它适用于所有类型的流(包括空流、无限流的有限前缀等),但注意:对无限流(如 Stream.iterate(...))直接调用 count() 会导致无限阻塞。
- ✅ 正确用法(有限流):
List<string> list = Arrays.asList("a", "b", "c");<br>long total = list.stream().count(); // 返回 3</string> - ❌ 避免用于真正无限流:
Stream.iterate(1, i -> i + 1).count(); // 永远不会结束
替代方案:用 mapToInt + sum(仅限特定场景)
如果已对流做了映射(例如转为数值流),也可用 mapToInt(x -> 1).sum() 实现计数,但这是“绕路”做法,性能略低且可读性差,仅在需要同时做其他整型聚合时才考虑。
- ⚠️ 不推荐单纯计数:
long total = list.stream().mapToInt(e -> 1).sum(); // 功能等价,但不直观 - ? 合理场景举例(统计满足条件的元素个数):
long evenCount = IntStream.range(1, 10).filter(n -> n % 2 == 0).count();
注意 count() 的短路特性与性能
count() 不是短路操作(short-circuiting),它必须消费整个流才能得出结果。这意味着即使你只关心“是否为空”,也应优先用 findAny().isPresent() 或 anyMatch(x -> true),它们可能提前终止。
- ? 判断非空更高效:
boolean hasElements = stream.findAny().isPresent(); // 可能立即返回 - ? 确实要总数时,
count()仍是唯一标准答案
不复杂但容易忽略:count() 是终端操作,调用后流就关闭了,不能复用。如需多次统计,请重新创建流或先收集为集合。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











