关闭Java 8 Stream

Pau*_*Pau 31 java java-8 java-stream

如果我们使用Java 8 Stream就像list.stream().filter(....).collect(..).....它什么时候关闭这个流?

作为下一个例子,我们关闭流我们是好的做法吗?

Stream<String> stream = list.stream();
String result = stream.limit(10).collect(Collectors.joining(""));
stream.close();
Run Code Online (Sandbox Code Playgroud)

kap*_*pex 52

通常没有必要关闭流.您只需要关闭使用IO资源的流.

来自Stream文档:

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

如果需要关闭流,那么最佳做法是使用try-with-resources语句:

try ( Stream<String> stream = Files.lines(path, charset) ) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)


184*_*615 8

我必须补充一点,默认情况下流根本不关闭!

List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

// "--" is not printed at all:
list.stream().onClose(()->System.out.println("--")).forEach(x -> System.out.println(x));

System.out.println("with try(){}:");

// "--" is printed:
try (Stream<Integer> stream = list.stream() ) {
    stream.onClose(() -> System.out.println("--")).forEach(x -> System.out.println(x));
}
Run Code Online (Sandbox Code Playgroud)


小智 5

当然,默认情况下您应该关闭流。

流是一个非常通用的 API;重点是它代表了一个数据流,而不需要该数据的消费者了解数据的来源。

关闭不需要关闭的流没有成本;未能关闭需要关闭的流可能会导致严重的问题。您有多确定您正在编写的代码(当前使用不需要关闭的数据流)永远不会被重新用于使用需要关闭的不同类型的流?

我刚刚完成了大量代码的重构,这些代码曾经使用内存数据库来代替 SQL 后端。有问题的代码经常使用流,这是有充分理由的。将 JDBC 结果集封装在流中意味着我可以(......我认为)很容易实现我的目标。但是……我的新流封装了一个需要关闭的资源,而旧流则没有。因为最初的开发人员(在这种情况下是我,我在踢自己)没有关闭流,所以需要进行繁琐的调试。

  • 不,默认情况下您不应该关闭流。仅当您从明确要求关闭的地方获取它时才应该关闭它。_“关闭不需要关闭的流没有成本”_成本在于不必要的代码,这会增加混乱并使代码更难以阅读。 (2认同)