为何Java Stream的count()终端操作未触发map中的中间打印步骤?
为什么Stream的map操作没被count()触发执行?
先看你给出的代码:
import java.util.stream.*; public class MyClass { public static void main(String args[]) { Long x = Stream.of(1, 2, 3).map(i -> { System.out.println(i); return i + 4; }).count(); System.out.println(x); // prints '3' } }
问题的核心在于Java Stream的惰性求值特性,以及count()终端操作的特殊优化:
- Stream的中间操作(比如这里的
map)是惰性的,只有当终端操作需要用到中间操作的结果时,才会触发执行。 count()的作用只是统计流中元素的数量,它完全不需要关心元素经过map转换后的具体值。对于像Stream.of(1,2,3)这种基于已知大小集合的流,JDK可以直接获取源集合的元素数量,根本没必要执行map里的转换逻辑,所以map中的打印语句自然不会被执行。
如果把count()换成需要依赖元素内容的终端操作(比如forEach或者collect),map就会被触发执行:
// 换成forEach,map会执行 Stream.of(1,2,3).map(i -> { System.out.println(i); return i+4; }).forEach(System.out::println);
内容的提问来源于stack exchange,提问作者microwth
相关产品推荐
相关产品推荐

