2015-10-29 30 views
5

tôi nhận được một số kết quả kỳ lạ khi cố gắng sử dụng một dòng song song và tôi biết một workaround, nhưng nó không có vẻ lý tưởngParallel suối cho mục null, Làm thế nào để làm trong Java 8

// Create the set "selected" 
somethingDao.getSomethingList().parallelStream() 
       .filter(something -> !selected.contains(something.getSomethingId())) 
       .forEach(something -> 
           somethingSubGroupDTO.addFilterDTO(
             new FilterDTO(something.getSomethingName(), something.getSomethingDescription(), false)) 
       ); 
selected.clear(); 

somethingDao.getSomethingList trả về một số List

selected là không được sửa đổi trong khi thao tác này.

somethingSubGroupDTO.addFilterDTO là một hàm trợ giúp bổ sung vào Danh sách không đồng bộ. Đây là vấn đề. Là một danh sách không đồng bộ, tôi nhận được ít các mục trong danh sách hơn dự kiến ​​và một số mục là rỗng. Nếu tôi biến nó thành một danh sách được đồng bộ hóa thì nó sẽ hoạt động. Rõ ràng việc thêm sự tranh chấp khóa vào một luồng song song không phải là lý tưởng.

Ở cấp độ cao, tôi biết có thể thực hiện việc này theo cách mà mỗi luồng sẽ xử lý riêng và khi chúng tham gia, chúng sẽ tổng hợp. (Ít nhất tôi có thể tưởng tượng một quá trình như vậy mà không có sự tranh chấp khóa) Tuy nhiên kể từ khi tôi mới để xử lý dòng Java 8 tôi không biết làm thế nào. Làm cách nào để thực hiện thao tác tương tự này mà không có tranh chấp tại một điểm duy nhất?

Trả lời

8

Không sử dụng forEach và thu thập Suối của bạn thành một List thay vì:

somethingDao.getSomethingList().parallelStream() 
       .filter(something -> !selected.contains(something.getSomethingId())) 
       .map(something -> new FilterDTO(something.getSomethingName(), something.getSomethingDescription(), false)) 
       .collect(toList()); 

Sau đó, bạn có thể thiết lập danh sách trả về trực tiếp vào đối tượng somethingSubGroupDTO của bạn, thay vì thêm một mục tại một thời điểm.

+0

Và điều này trả về một danh sách mà sau đó tôi có thể thêm vào bộ sưu tập của mình ở cuối danh sách chứ không phải từng lần một? –

+1

@CarlosBribiescas Chính xác – Tunaki

+0

Cảm ơn bạn đã trả lời câu hỏi của tôi. Theo dõi, có thể chỉ định danh sách nào nên tổng hợp để cuối cùng nó tự động thêm vào không? Không cần thiết, chỉ tò mò thôi. –

Các vấn đề liên quan