java stream api 统计元素数量最直接的方式是调用 count() 方法,该方法返回一个 long 类型的结果。对于非空流,它会遍历所有元素并计数;如果流为空,则直接返回 0。在需要处理可能为空的集合时,建议先进行判空检查或使用 optional 包装,以避免潜在的逻辑错误。

如何对特定条件的元素进行计数?
要统计满足特定条件的元素数量,可以在调用 count() 之前使用 filter() 操作。例如,统计列表中大于 5 的元素个数,只需在流管道中加入 .filter(n -> n > 5)。这种组合方式非常灵活,可以处理复杂的布尔表达式。

import java.util.Arrays;
import java.util.List;
public class CountExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 3, 6, 8, 2, 9);
// 统计大于 5 的元素数量
long count = numbers.stream()
.filter(n -> n > 5)
.count();
System.out.println("Count: " + count); // 输出: Count: 3
}
}
如何处理空集合或 null 输入?
当输入集合可能为 null 时,直接调用 .stream() 会抛出 NullPointerException。安全的做法是先判断集合是否为空,或者使用 Optional.ofNullable() 来包裹集合。如果集合为空列表,count() 会正常返回 0,但不会报错。
立即学习“Java免费学习笔记(深入)”;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
public class SafeCountExample {
public static void main(String[] args) {
List<Integer> emptyList = Arrays.asList();
List<Integer> nullList = null;
// 安全处理 null 输入
long safeCount = Optional.ofNullable(nullList)
.map(List::stream)
.orElse(java.util.stream.Stream.empty())
.count();
System.out.println("Safe Count: " + safeCount); // 输出: Safe Count: 0
// 空列表直接调用
long emptyCount = emptyList.stream().count();
System.out.println("Empty Count: " + emptyCount); // 输出: Empty Count: 0
}
}
并行流计数性能如何?
对于大型数据集,可以使用 parallelStream().count() 来利用多核 CPU 提升性能。然而,由于 count() 本身是一个终端操作且无状态,并行化的收益取决于数据分片的开销。在小规模数据下,并行流可能因为线程调度开销而比串行流更慢。


















