2015-07-31 50 views
6

Tôi đang cố gắng sử dụng luồng List<Map<String, Integer>> để hợp nhất tất cả các bản đồ được bao gồm thành một. Điều này là để tổng hợp nhiều câu trả lời yêu cầu thành một.Dòng Java 8 - hợp nhất danh sách Bản đồ

Xem xét số liệu này (sử dụng JSON để làm cho nó dễ dàng hơn để đọc):

[ 
    {"field1": 1, "field2": 5}, 
    {"field2": 6, "field3": 10}, 
    {"field1": 3, "field4": 15} 
] 

Tôi muốn nó gây ra như sau (theo thứ tự không không vấn đề):

{"field1": 4, "field2": 11, "field3": 10, "field4": 15} 

tôi muốn tổng hợp tất cả các khóa và kết hợp chúng thành một bản đồ. Có cách nào tốt đẹp để làm điều này với giao diện Stream trong Java 8?

Tôi đã phát hiện Collectors.groupingBy(o -> o, Collectors.counting()), vì vậy có lẽ tôi đang đi đúng hướng, tôi chỉ cần tìm ra cách để hợp nhất chúng trước điều này mà không làm hỏng kết quả.

Xin cảm ơn trước.

Trả lời

13

counting() sẽ chỉ trả về số lượng giá trị được nhóm theo hàm mà bạn áp dụng cho mỗi khóa. Nếu bạn muốn tổng hợp, các nhà sưu tập hạ lưu bạn đang tìm kiếm là summingInt (hoặc summingLong nếu bạn có thể có tràn):

import static java.util.stream.Collectors.groupingBy; 
import static java.util.stream.Collectors.summingInt; 

... 

Map<String, Integer> map = 
    list.stream() 
     .flatMap(m -> m.entrySet().stream()) 
     .collect(groupingBy(Map.Entry::getKey, summingInt(Map.Entry::getValue))); 
+2

đơn giản hơn nhiều so với những gì tôi lên đâu. – rgettman

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