2016-08-01 32 views
12

Jeśli używamy Java 8 Stream jak list.stream().filter(....).collect(..)..... Kiedy jest zamknięty ten strumień?Zamknij Java 8 Stream

Czy to dobra praktyka, że ​​zamykamy strumień jako następny przykład?

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

Od docs: Strumienie mają metodę BaseStream.close() i wdrożyć AutoCloseable, ale prawie wszystkie przypadki strumień rzeczywistości nie muszą być zamknięte po użyciu. Zwykle tylko strumienie, których źródłem jest kanał We/Wy (takie jak te zwrócone przez Files.lines (Ścieżka, Zestaw znaków)) będą wymagały zamknięcia. Większość strumieni jest wspierana przez kolekcje, tablice lub funkcje generujące, które nie wymagają specjalnego zarządzania zasobami. (Jeśli strumień wymaga zamknięcia, może zostać zadeklarowany jako zasób w instrukcji try-with-resources.) – Matt

+0

Nie sądzę, że musisz zamknąć TO "strumień" ^) – injecteer

+3

Strumienie w ogóle nie muszą być Zamknięte. Tylko niektóre strumienie, które uzyskują dostęp do zasobów, takie jak 'DirectoryStream', muszą zostać zamknięte. Najlepszym sposobem na to jest użycie instrukcji [try-with-resources] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html). – Jesper

Odpowiedz

22

Zazwyczaj nie jest konieczne zamykanie strumieni. Musisz tylko zamknąć strumienie, które używają zasobów We/Wy.

Z Stream documentation:

Strumienie mają metodę BaseStream.close() i wdrożenie AutoCloseable, ale prawie wszystkie przypadki strumień rzeczywistości nie muszą być zamknięte po użyciu. Zwykle tylko strumienie, których źródłem jest kanał We/Wy (takie jak te zwrócone przez Files.lines(Path, Charset)), wymagają zamknięcia. Większość strumieni jest wspierana przez kolekcje, tablice lub funkcje generujące, które nie wymagają specjalnego zarządzania zasobami. (Jeśli strumień wymaga zamknięcia, nie może być uznana jako zasób w try-with-zasobów oświadczeniu.)

Jeśli trzeba zamknąć strumień, potem najlepszą praktyką byłoby wykorzystać okazję -Z-resources oświadczenie:

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