2016-08-01 54 views
12

如果我們使用Java 8 Stream類似list.stream().filter(....).collect(..).....什麼時候關閉了這個流?關閉Java 8 Stream

是不是很好的做法,我們關閉了作爲下一個例子的流?

Stream<String> stream = list.stream(); 
String result = stream.limit(10).collect(Collectors.joining("")); 
stream.close(); 
+4

從文檔:Streams有一個BaseStream.close()方法並實現AutoCloseable,但幾乎所有的流實例實際上並不需要在使用後關閉。通常,只有源數據流是IO通道的數據流(如Files.lines(Path,Charset)返回的數據流)需要關閉。大多數流由集合,數組或生成函數支持,不需要特殊的資源管理。 (如果一個流確實需要關閉,它可以在try-with-resources語句中聲明爲資源。) – Matt

+0

我不認爲你需要關閉那個「流」^) – injecteer

+3

流一般不需要是關閉。只有一些訪問諸如「DirectoryStream」之類資源的流需要關閉。最好的方法是使用[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)語句。 – Jesper

回答

22

根本沒有必要關閉流。您只需關閉使用IO資源的流。

Stream documentation

流有BaseStream.close()方法和實施AutoCloseable,但幾乎所有的流實例也確實需要使用後不會被關閉。一般來說,只有來源是IO通道的流(例如由Files.lines(Path, Charset)返回的流)需要關閉。大多數流由集合,數組或生成函數支持,不需要特殊的資源管理。 (如果流確實需要關閉,它可以聲明爲在try-與資源語句資源。)

如果您需要關閉流,那麼最好的做法是使用try -with-resources聲明:

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