Không dùng lại được. Mỗi stream chỉ đi qua một thao tác terminal; gọi lần hai ném IllegalStateException: stream has already been operated upon or closed.
java
Stream<String> s = List.of("a", "b").stream();
s.count();
s.forEach(System.out::println); // IllegalStateException
Supplier<Stream<String>> factory = () -> List.of("a", "b").stream();
factory.get().count();
factory.get().forEach(System.out::println); // OK - tạo stream mớiKhông thấy chạy là vì stream lười (lazy): filter, map, peek, sorted chỉ mô tả pipeline.
Không có thao tác terminal (collect, forEach, count, reduce, findFirst...) thì không phần tử nào được xử lý.
java
list.stream().map(this::save); // không chạy gì cả
list.stream().map(this::save).toList(); // giờ mới chạyHai hệ quả thực tế:
- Đừng dùng peek để làm việc thật. Javadoc nói nó dành cho debug, và pipeline có thể bỏ qua nó khi kết quả không cần duyệt phần tử (vd count() trên nguồn đã biết kích thước).
- Lazy cho phép short-circuit: findFirst, anyMatch, limit dừng sớm, nên stream().filter(...).findFirst() không quét hết danh sách.