2015-05-26 65 views
28

Để hiểu rõ hơn về API luồng mới, tôi đang cố gắng chuyển đổi một số mã cũ, nhưng tôi bị kẹt trên mã này.Java 8 Stream Collecting Set

public Collection<? extends File> asDestSet() { 
    HashMap<IFileSourceInfo, Set<File>> map = new HashMap<IFileSourceInfo, Set<File>>(); 
    //... 
    Set<File> result = new HashSet<File>(); 
    for (Set<File> v : map.values()) { 
     result.addAll(v); 
    } 
    return result; 
} 

tôi dường như không thể tạo ra một sưu tập có giá trị cho nó:

public Collection<? extends File> asDestSet() { 
    HashMap<IFileSourceInfo, Set<File>> map = new HashMap<IFileSourceInfo, Set<File>>(); 
    //... 
    return map.values().stream().collect(/* what? */); 
} 
+5

'return map.values ​​(). Stream(). FlatMap (Set :: stream) .collect (Collectors.toSet());' hoặc '.collect (toCollection (HashSet :: new));' như ở đó không đảm bảo đằng sau việc triển khai cài đặt được trả về bởi 'toSet()'. –

+2

hoặc '.collect (HashSet :: new, Set :: addAll, Set :: addAll)' – Misha

Trả lời

65

Sử dụng flatMap:

return map.values().stream().flatMap(Set::stream).collect(Collectors.toSet()); 

Các flatMap flattens tất cả các bộ của bạn vào dòng duy nhất.

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