2016-08-01 15 views
12

Wenn wir Java 8 Stream wie list.stream().filter(....).collect(..)..... verwenden Wann ist dieser Stream geschlossen?Schließen Java 8 Stream

Ist es eine gute Übung, dass wir den Stream als nächstes Beispiel schließen?

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

Aus der Dokumentation: Ströme haben eine BaseStream.close() Methode und implementieren AutoCloseable, aber fast alle Strom-Instanzen müssen nicht tatsächlich nach Gebrauch verschlossen werden. Im Allgemeinen müssen nur Datenströme geschlossen werden, deren Quelle ein E/A-Kanal ist (z. B. solche, die von Files.lines (Path, Charset) zurückgegeben werden). Die meisten Streams werden durch Sammlungen, Arrays oder generierende Funktionen unterstützt, die keine spezielle Ressourcenverwaltung erfordern. (Wenn ein Stream geschlossen werden muss, kann er in einer try-with-resources-Anweisung als Ressource deklariert werden.) – Matt

+0

Ich glaube nicht, dass Sie THAT "stream" schließen müssen ^) – injecteer

+3

Streams müssen im Allgemeinen nicht sein geschlossen. Nur einige Streams, die auf Ressourcen wie einen 'DirectoryStream' zugreifen, müssen geschlossen werden. Der beste Weg dazu ist die Verwendung einer [try-with-resources] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) Anweisung. – Jesper

Antwort

22

Es ist im Allgemeinen nicht notwendig, Ströme überhaupt zu schließen. Sie müssen nur Streams schließen, die IO-Ressourcen verwenden.

Vom Stream documentation:

Streams haben eine BaseStream.close() Methode und implementieren AutoCloseable, aber fast alle Strom-Instanzen müssen nicht tatsächlich nach Gebrauch verschlossen werden. Im Allgemeinen müssen nur Datenströme geschlossen werden, deren Quelle ein E/A-Kanal ist (z. B. die von Files.lines(Path, Charset) zurückgegebenen Datenströme). Die meisten Streams werden durch Sammlungen, Arrays oder generierende Funktionen unterstützt, die keine spezielle Ressourcenverwaltung erfordern. (Wenn ein Stream Schließung erfordert, kann es in einer Try-mit-Ressourcen Aussage als Ressource deklariert werden.)

Wenn Sie benötigen einen Stream zu schließen, dann würde die Best Practice den Versuch zu benutzen, -mit-Ressourcen Aussage:

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