java 8 forEach关闭流时的奇怪行为

java 8 forEach关闭流时的奇怪行为,java,foreach,stream,Java,Foreach,Stream,在关闭流满足特定条件后,我试图停止forEach,因此我执行了以下操作 Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5); stream.forEach((e) -> { System.out.println("inside for Each"); if(e == 3) { stream.close();

在关闭流满足特定条件后,我试图停止forEach,因此我执行了以下操作

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
        stream.forEach((e) -> {
            System.out.println("inside for Each");
            if(e == 3) {
                stream.close();
            } else {
                System.out.println(e);
            }
        });
但我得到了以下结果:

inside for Each  
1  
inside for Each  
2  
inside for Each  
inside for Each
1
inside for Each
2
inside for Each
inside for Each
4
inside for Each
5
这意味着在关闭流后,
forEach
继续。。。它甚至没有在流关闭后抛出关于访问元素的异常。对这个输出有什么解释吗?

来自

流有一个BaseStream.close()方法并实现自动关闭,但几乎所有流实例在使用后都不需要关闭。通常,只有源为IO通道的流(例如由Files.lines(Path,Charset)返回的流)才需要关闭。大多数流由集合、数组或生成函数支持,它们不需要特殊的资源管理。(如果流确实需要关闭,则可以在try with resources语句中将其声明为资源。)

即使源是IO通道,在forEach中关闭它也不是使用流的方式。

Javadoc of:

关闭此流,导致调用此流管道的所有关闭处理程序


由于没有向流注册的close处理程序,因此调用是一种不同的方法,假设一个有序流:

Stream=Stream.of(1,2,3,4,5)

stream.takeWhile(n->njava stream)不是为此而设计的。说明:该流后面没有资源,因此
close()
是不可操作的。提示:当你对一个特定的概念不熟悉时,就去研究它。所有java库类都有很好的文档,并且有很多教程解释它们的用法。所以:先阅读文档。查看教程。但是避免假设这个或那个库调用应该做什么。如果没有close处理程序s、 那么,为什么在我调用stream.close()然后调用stream.forEach(System.out::println)时引发异常?…异常消息是说流已经关闭。@Abdelrahman_Attya stream有一个标志指示流是否关闭,并在forEach的开头检查该标志,而不是在流处理时。