2014-12-12 27 views
6

Giả sử chúng ta có một Collection như thế này:Java 8 dòng và parallelStream

Set<Set<Integer>> set = Collections.newSetFromMap(new ConcurrentHashMap<>()); 
for (int i = 0; i < 10; i++) { 
    Set<Integer> subSet = Collections.newSetFromMap(new ConcurrentHashMap<>()); 
    subSet.add(1 + (i * 5)); 
    subSet.add(2 + (i * 5)); 
    subSet.add(3 + (i * 5)); 
    subSet.add(4 + (i * 5)); 
    subSet.add(5 + (i * 5)); 
    set.add(subSet); 
} 

và để xử lý nó:

set.stream().forEach(subSet -> subSet.stream().forEach(System.out::println)); 

hoặc

set.parallelStream().forEach(subSet -> subSet.stream().forEach(System.out::println)); 

hoặc

set.stream().forEach(subSet -> subSet.parallelStream().forEach(System.out::println)); 

hoặc

set.parallelStream().forEach(subSet -> subSet.parallelStream().forEach(System.out::println)); 

như vậy, ai đó có thể xin vui lòng giải thích cho tôi:

  • sự khác biệt giữa chúng là gì?
  • Cái nào tốt hơn? nhanh hơn? và an toàn hơn?
  • Phương pháp nào phù hợp cho bộ sưu tập lớn?
  • Điều nào tốt khi chúng tôi muốn áp dụng các quy trình nặng cho mỗi mục?

Trả lời

7

Sự khác nhau giữa chúng là gì?

Hãy nghĩ về nó giống như hai vòng lồng nhau.

  • Trong trường hợp đầu tiên không có lý song song,
  • trong trường hợp thứ hai vòng ngoài/bộ sưu tập là song song
  • Trong trường hợp thứ ba vòng lặp bên trong/bộ sưu tập nếu song song hơn.
  • trong trường hợp cuối cùng, bạn có một hỗn hợp song song có khả năng khó hiểu hơn là hữu ích.

Trường hợp thứ nhất không rõ ràng vì chỉ có một nhóm luồng trong thực tế và nếu hồ bơi bận thì luồng hiện tại có thể được sử dụng, tức là nó có thể không song song^2.

Cái nào tốt hơn? nhanh hơn? và an toàn hơn?

Thứ nhất, tuy nhiên sử dụng bản đồ phẳng sẽ đơn giản trở lại.

set.stream().flatMap(s -> s.stream()).forEach(System.out::println); 

Các phiên bản khác phức tạp hơn và vì bàn điều khiển, là cổ chai, là tài nguyên được chia sẻ, phiên bản nhiều luồng có thể chậm hơn.

Cái nào tốt cho bộ sưu tập khổng lồ?

Giả sử mục đích của bạn là làm điều gì đó khác ngoài in, bạn muốn có đủ công việc để giữ cho tất cả CPU bận, nhưng không quá nhiều tác vụ tạo ra chi phí. Tùy chọn thứ hai có thể đáng xem xét.

Điều nào tốt khi chúng tôi muốn áp dụng quy trình nặng cho từng mục?

Ví dụ thứ hai, có thể là tốt nhất hoặc có thể là thứ ba nếu bạn có một số lượng nhỏ các bộ sưu tập bên ngoài.

+0

Cảm ơn bạn rất nhiều, lời giải thích rất hay :) – FaNaJ

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