Séb*_*ois 21 java java-8 java-stream
在阅读了https://www.airpair.com/java/posts/spring-streams-memory-efficiency之后,我很想从数据库中传出结果,但正如我与同事讨论的那样(cfr.评论他补充说文章),需要记住使用try-with-resources构造来避免任何内存泄漏.
Bri*_*etz 27
因为需要显式资源释放的流实际上是一个非常不寻常的情况.因此,我们选择不对所有流执行负担,这些内容仅对.01%的使用有价值.
我们制作了Stream Autocloseable,以便您可以根据需要从源中释放资源,但这是我们停止的地方,并且有充分的理由.
这样做不仅会使大多数用户自动负担他们不需要的额外工作,而且这也违反了一般原则:分配资源的人负责关闭资源.你打电话的时候
BufferedReader reader = ...
reader.lines().op().op()...
Run Code Online (Sandbox Code Playgroud)
你是打开资源的人,而不是流库,你应该关闭它.实际上,由于关闭在某个资源保持对象上调用访问器方法而产生的流有时会关闭底层对象,因此您可能不希望流BufferedReader为您关闭- 您可能希望它在调用后保持打开状态.
如果要关闭资源,这也很容易:
try (BufferedReader reader = ...) {
reader.lines().op()...
}
Run Code Online (Sandbox Code Playgroud)
你可能正在以特定的方式使用流,所以它可能看起来"显而易见"流应该做什么 - 但是有比你更多的用例.因此,我们不是满足于特定用例,而是从一般原则接近它:如果您打开流,并且希望它关闭,请自行关闭它,但如果您没有打开它,则不能让您关闭.