2016-08-01 49 views
12

Nếu chúng tôi sử dụng Java 8 Stream như list.stream().filter(....).collect(..)..... Khi nào nó đóng luồng này?Đóng Java 8 Stream

Thực tiễn tốt là chúng tôi đóng luồng chúng tôi làm ví dụ tiếp theo?

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

Từ tài liệu: Luồng có phương thức BaseStream.close() và triển khai AutoCloseable, nhưng gần như tất cả các phiên bản luồng không thực sự cần đóng sau khi sử dụng. Nói chung, chỉ các luồng có nguồn là kênh IO (chẳng hạn như các luồng được Files.lines trả về (Đường dẫn, Bộ ký tự)) sẽ yêu cầu đóng. Hầu hết các luồng được hỗ trợ bởi các bộ sưu tập, mảng hoặc các hàm tạo, không yêu cầu quản lý tài nguyên đặc biệt. (Nếu một luồng yêu cầu đóng, nó có thể được khai báo như là một nguồn lực trong một tuyên bố try-with-resources.) – Matt

+0

Tôi không nghĩ rằng bạn cần phải đóng "dòng" đó ^) – injecteer

+3

Các luồng nói chung không cần phải đã đóng cửa. Chỉ một số luồng truy cập các resouces như là 'DirectoryStream' cần được đóng lại. Cách tốt nhất để làm điều đó là sử dụng câu lệnh [try-with-resources] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html). – Jesper

Trả lời

22

Thông thường, không cần phải đóng luồng. Bạn chỉ cần đóng các luồng sử dụng tài nguyên IO.

Từ Stream documentation:

Streams có một phương pháp BaseStream.close() và thực hiện AutoCloseable, nhưng gần như tất cả các trường hợp dòng không thực sự cần phải được đóng lại sau khi sử dụng. Nói chung, chỉ những luồng có nguồn là kênh IO (chẳng hạn như nguồn được trả lại bởi Files.lines(Path, Charset)) sẽ yêu cầu đóng. Hầu hết các luồng được hỗ trợ bởi các bộ sưu tập, mảng hoặc các hàm tạo, không yêu cầu quản lý tài nguyên đặc biệt. (Nếu một dòng không yêu cầu đóng cửa, nó có thể được khai báo là một nguồn tài nguyên trong một tuyên bố thử với các nguồn tổng hợp.)

Nếu bạn cần phải đóng một dòng, sau đó thực hành tốt nhất là nên sử dụng thử tuyên bố -with-resources:

try (Stream<String> stream = Files.lines(path, charset)) { 
    // do something 
} 
Các vấn đề liên quan