Dòng
Trước Java 8
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
Java 8
Chúng tôi cũng có thể sử dụng lambda và stream ( Hướng dẫn ):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
Tại sao forEachOrdered
và không forEach
với luồng?
Hành vi của forEach
rõ ràng là không đặc biệt khi forEachOrdered
thực hiện một hành động cho từng thành phần của luồng này, theo thứ tự bắt gặp của luồng nếu luồng có thứ tự bắt gặp được xác định. Vì vậy, forEach
không đảm bảo rằng thứ tự sẽ được giữ.
Ngoài ra khi làm việc với các luồng (đặc biệt là các luồng song song) hãy ghi nhớ bản chất của các luồng. Theo tài liệu :
Kết quả đường ống dòng có thể không xác định hoặc không chính xác nếu các tham số hành vi cho các hoạt động luồng là trạng thái. Một lambda trạng thái là một kết quả phụ thuộc vào bất kỳ trạng thái nào có thể thay đổi trong quá trình thực hiện đường ống truyền phát.
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
Ở đây, nếu hoạt động ánh xạ được thực hiện song song, kết quả cho cùng một đầu vào có thể thay đổi từ chạy sang chạy, do sự khác biệt về lập lịch của luồng, trong khi đó, với biểu thức lambda không trạng thái, kết quả sẽ luôn giống nhau.
Nhìn chung, các tác dụng phụ trong các tham số hành vi đối với các hoạt động truyền phát, không được khuyến khích, vì chúng thường có thể dẫn đến việc vô tình vi phạm yêu cầu không trạng thái, cũng như các nguy cơ về an toàn luồng khác.
Các luồng có thể có hoặc không có thứ tự bắt gặp được xác định. Việc một luồng có thứ tự gặp hay không phụ thuộc vào nguồn và các hoạt động trung gian.