Java Stream终端操作不能链式调用?对可行写法的疑问
关于Stream终端操作的困惑解答
你之所以有这个误解,是没搞清楚调用链里每个方法的归属:
Stream.map()是中间操作,返回的还是一个Stream实例collect()是Stream的终端操作,执行后会把Stream转换为具体的集合对象(比如List、Set),此时原Stream已经被消耗,无法再使用- 后面的
forEach()根本不是Stream的方法,而是Collection接口的默认方法,你是在调用集合对象的遍历方法,和原Stream完全无关
说白了,你这段代码不是在同一个Stream上链式调用两个终端操作,而是先把Stream转成集合,再操作这个集合。
如果真的尝试在同一个Stream上执行两个终端操作,代码会直接报错,比如:
Stream<String> stream = Stream.of("x", "y"); stream.collect(Collectors.toList()); stream.forEach(System.out::println); // 运行时抛出IllegalStateException
这是因为第一个collect()已经消耗了Stream,后续再调用终端操作时,Stream已经处于关闭状态。
总结:
- 一个Stream确实只能执行一次终端操作,执行后就被消耗
- 你写的代码里,
forEach()是集合的方法,不是Stream的终端操作,所以完全符合规则
内容的提问来源于stack exchange,提问作者PinkCoder
相关产品推荐
相关产品推荐

