Java Stream API延迟求值疑问:map+count无输出,加filter则有?
Stream中count()触发中间操作的差异原因
先看两段代码的表现:
无打印输出的代码
List.of("a","b","c","D").stream() .map(m -> { System.out.println(m); return m; }) .count();
有打印输出的代码
List.of("a","b","c","D").stream() .filter(f -> f.matches("[a-z]")) .map(m -> { System.out.println(m); return m; }) .count();
造成这种差异的核心原因是Java Stream的短路优化机制:
- 第一个场景里,Stream的源是List,属于「可直接获取元素总数」的Sized流。
count()操作在这里不需要执行任何中间操作,直接从源集合拿到元素总数即可,所以map里的打印逻辑完全不会被触发。 - 第二个场景添加
filter后,Stream不再是Sized流——因为filter可能过滤掉部分元素,无法提前知道最终符合条件的元素数量,必须逐个遍历元素执行filter判断,之后才会触发后续的map操作,所以map里的打印就会生效。
内容的提问来源于stack exchange,提问作者Noel
相关产品推荐
相关产品推荐

