Bạn đang hỏi sai câu hỏi. Bạn đang hỏi về sequential
so với parallel
trong khi bạn muốn xử lý các mục theo thứ tự , vì vậy bạn phải hỏi về việc đặt hàng . Nếu bạn có một luồng được đặt hàng và thực hiện các hoạt động đảm bảo duy trì trật tự, thì luồng đó được xử lý song song hay tuần tự; việc thực hiện sẽ duy trì trật tự.
Các thuộc tính được đặt hàng là khác biệt so với song song và tuần tự. Ví dụ: nếu bạn gọi stream()
trên một HashSet
luồng sẽ không được sắp xếp trong khi gọi stream()
trên List
trả về một luồng đã ra lệnh. Lưu ý rằng bạn có thể gọi unordered()
để giải phóng hợp đồng đặt hàng và có khả năng tăng hiệu suất. Một khi luồng không có thứ tự, không có cách nào để thiết lập lại thứ tự. (Cách duy nhất để biến một luồng không có thứ tự thành một thứ tự là gọi sorted
, tuy nhiên, thứ tự kết quả không nhất thiết phải là thứ tự ban đầu).
Xem thêm phần Đặt hàng trên mạng của java.util.stream
tài liệu gói .
Để đảm bảo duy trì trật tự trong toàn bộ hoạt động luồng, bạn phải nghiên cứu tài liệu về nguồn của luồng, tất cả các hoạt động trung gian và hoạt động của thiết bị đầu cuối để xem chúng có duy trì đơn hàng hay không (hoặc liệu nguồn có đặt hàng trước không địa điểm).
Điều này có thể rất tinh tế, ví dụ: Stream.iterate(T,UnaryOperator)
tạo một luồng có thứ tự trong khi Stream.generate(Supplier)
tạo ra một luồng không có thứ tự . Lưu ý rằng bạn cũng đã mắc một lỗi phổ biến trong câu hỏi của mình vì không duy trì việc đặt hàng. Bạn phải sử dụng nếu bạn muốn xử lý các phần tử của luồng theo thứ tự được bảo đảm.forEach
forEachOrdered
Vì vậy, nếu list
câu hỏi của bạn thực sự là a java.util.List
, stream()
phương thức của nó sẽ trả về một luồng được đặt hàng và filter
sẽ không thay đổi thứ tự. Vì vậy, nếu bạn gọi list.stream().filter() .forEachOrdered()
, tất cả các phần tử sẽ được xử lý tuần tự theo thứ tự, trong khi đối với list.parallelStream().filter().forEachOrdered()
các phần tử có thể được xử lý song song (ví dụ: bằng bộ lọc) nhưng hành động cuối sẽ vẫn được gọi theo thứ tự (rõ ràng sẽ làm giảm lợi ích của việc thực thi song song) .
Nếu bạn, ví dụ, sử dụng một hoạt động như
List<…> result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList());
toàn bộ hoạt động có thể được hưởng lợi từ việc thực hiện song song nhưng danh sách kết quả sẽ luôn theo đúng thứ tự, bất kể bạn sử dụng luồng song song hay tuần tự.