này nên làm việc cho bất kỳ số lượng bản đồ:
def maps = [[a: 1, b: 2], [b:1, c:3]]
def result = [:].withDefault{0}
maps.collectMany{ it.entrySet() }.each{ result[it.key] += it.value }
assert result == [a: 1, b: 3, c: 3]
Khái niệm maps.collectMany{ it.entrySet() }
trả về một danh sách các mục bản đồ, như [a=1, b=2, b=1, c=3]
, và sau đó mỗi người trong số đó được thêm vào kết quả.
Một tùy chọn khác, nếu bạn muốn giữ tất cả biến đổi thành một biểu thức và làm cho nó "thêm chức năng", trước tiên hãy nhóm các mục theo khóa và sau đó tổng hợp các giá trị, nhưng tôi nghĩ nó ít có thể đọc được:
def result = maps.collectMany{ it.entrySet() }
.groupBy{ it.key }
.collectEntries{[it.key, it.value.sum{ it.value }]}
phần groupBy
trả về một bản đồ có dạng [a:[a=1], b:[b=2, b=1], c:[c=3]]
và sau đó là collectEntries
biến đổi mà bản đồ vào nhau mà có Kays tương tự nhưng có tổng các danh sách trong các giá trị thay thế.
Tôi nghĩ cung cấp một phương pháp hoàn chỉnh với một chữ ký đẹp như ví dụ thứ hai của bạn (thay vì biểu hiện được ném trong không khí) thực sự thêm một chút vào chất lượng tổng thể của phản hồi, bởi vì đó là cách chúng ta nên viết những loại điều này trong mã "thực" nếu chúng ta lo lắng về chất lượng mã. +1 = D – epidemian