Tôi không thể tìm thấy bất kỳ thứ gì được tích hợp sẵn ... nhưng bằng cách sử dụng ExpandoMetaClass, tôi có thể thực hiện việc này:
ArrayList.metaClass.collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
điều này sẽ thêm phương thức collectMap vào tất cả ArrayLists ... Tôi không chắc tại sao việc thêm nó vào Danh sách hoặc Bộ sưu tập không hoạt động .. Tôi đoán đó là cho một câu hỏi khác ... nhưng bây giờ tôi có thể làm điều này ...
assert ["foo":"oof", "42":"24", "bar":"rab"] ==
["foo", "42", "bar"].collectMap { return [it, it.reverse()] }
từ Danh sách đến Bản đồ được tính toán với một lần đóng ... chính xác những gì tôi đang tìm kiếm.
Chỉnh sửa: lý do tôi không thể thêm phương thức vào Danh sách và Bộ sưu tập giao diện là vì tôi đã không làm điều này:
List.metaClass.enableGlobally()
sau cuộc gọi phương thức đó, bạn có thể thêm các phương thức vào giao diện .. trong trường hợp này có nghĩa là phương thức collectMap của tôi sẽ hoạt động trên các phạm vi như sau:
(0..2).collectMap{[it, it*2]}
tạo ra bản đồ: [0: 0, 1: 2, 2: 4]