2015-01-15 32 views
18

Tôi có List<Map<String, String>> mỗi mục trong danh sách là một bản đồ ví dụJava 8 Suối groupingby

companyName - IBM 
firstName - James 
country - USA 
... 

Tôi muốn tạo ra một Map<String, List<String>> nơi nó maps CompanyName vào một danh sách của các firstName ví dụ

IBM -> James, Mark 
ATT -> Henry, Robert.. 


private Map<String,List<String>> groupByCompanyName(List<Map<String, String>> list) { 
    return list.stream().collect(Collectors.groupingBy(item->item.get("companyName"))); 
} 

nhưng điều này sẽ tạo ra Map<String, List<Map<String, String>> (ánh xạ comanyName vào danh sách bản đồ)

cách tạo Map<String, List<String>>?

Trả lời

29

đã không kiểm tra nó, nhưng một cái gì đó như thế này nên làm việc:

Map<String, List<String>> namesByCompany 
    = list.stream() 
      .collect(Collectors.groupingBy(item->item.get("companyName"), 
        Collectors.mapping(item->item.get("firstName"), Collectors.toList()))); 
+0

Có cách nào để nhận 'Chuỗi []' thay vì 'Danh sách ' –

+1

Tôi không nghĩ vậy (ít nhất là không trực tiếp), vì không có phương thức 'Collectors.toArray'. @VinitSolanki – Eran

5

Bạn có thể sử dụng các hình thức:

groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream) 

ví dụ: xác định các giá trị từ các bản đồ trong hạ lưu được thực hiện như danh sách. Tài liệu có ví dụ tốt cho nó (here).

downstream là một cái gì đó giống như - mapping(item->item.get(<name>), toList())

0

Phương pháp groupingBy mang lại một bản đồ có giá trị là danh sách. Nếu bạn muốn xử lý các danh sách đó theo cách nào đó, hãy cung cấp "collector downstream" Trong trường hợp của bạn, bạn không muốn một List làm giá trị, vì vậy bạn cần cung cấp một bộ thu hạ lưu.

Để thao tác các bản đồ, bạn có thể sử dụng các bản đồ phương pháp tĩnh trong hồ sơ Người thu gom:

Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper, 
          Collector<? super U, A, R> downstream) 

Nó cơ bản tạo ra một nhà sưu tập bằng cách áp dụng một chức năng để kết quả hạ lưu và chuyển các chức năng để thu khác.

Collectors.mapping(item->item.get("firstName"), Collectors.toList()) 

Điều này sẽ trả về bộ thu hạ lưu sẽ đạt được những gì bạn muốn.

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