count()是java stream的终端操作,返回long类型元素总数,需遍历全部元素,支持过滤统计、并行流聚合,但性能低于collection的size()。

在 Java 中,使用 count() 方法可以轻松获取流(Stream)中元素的总数。这个方法是终端操作,会触发流的执行,并返回一个 long 类型的结果。
直接调用 count() 获取总数
对任意流(如集合、数组或自定义数据源生成的流),只需在流管道末尾调用 count() 即可:
List<string> list = Arrays.asList("a", "b", "c");
long size = list.stream().count(); // 返回 3
</string>
-
count()是一个短路无关操作,必须遍历全部元素才能得出结果 - 返回类型固定为
long,即使源很小(比如空列表)也返回0L - 不能在已关闭的流上重复调用,否则抛出
IllegalStateException
配合过滤或转换后统计数量
常用于“满足某条件的元素个数”,例如统计偶数、非空字符串等:
List<integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
long evenCount = numbers.stream()
.filter(n -> n % 2 == 0)
.count(); // 返回 3
</integer>
- 中间操作(如
filter、map)不影响count()的语义,只改变参与计数的元素集合 - 如果流是并行的(
parallelStream()),count()仍能正确返回总数,内部自动聚合
注意 null 和空流的情况
count() 本身不关心元素是否为 null,只要流能生成这些元素,就会计入总数:
List<string> withNulls = Arrays.asList("hello", null, "world");
long total = withNulls.stream().count(); // 返回 3,null 也被计为一个元素
</string>
- 空集合调用
stream().count()返回0L - 若流来源本身为
null(如((List>)null).stream()),会立即抛出NullPointerException - 需要判空应放在调用
stream()之前,而非依赖count()
替代方案与性能提醒
虽然 count() 简洁直观,但在某些场景下需谨慎:
- 对
Collection直接调用size()比stream().count()更高效(O(1) vs O(n)) - 若后续还需遍历流做其他处理,重复走流可能低效;可考虑用
Collectors.counting()或一次性收集 - 大数据量流 + 复杂中间操作时,
count()仍会完整执行整个流水线,无法跳过计算
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











