ฉันไม่พบสิ่งใดในตัว ... แต่เมื่อใช้ ExpandoMetaClass ฉันสามารถทำได้:
ArrayList.metaClass.collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
นี่เป็นการเพิ่มเมธอด collectMap ให้กับ ArrayLists ทั้งหมด ... ฉันไม่แน่ใจว่าทำไมเพิ่มลงใน List หรือ Collection ไม่ได้ผล .. ฉันเดาว่าเป็นคำถามอื่น ... แต่ตอนนี้ฉันทำได้แล้ว ...
assert ["foo":"oof", "42":"24", "bar":"rab"] ==
["foo", "42", "bar"].collectMap { return [it, it.reverse()] }
จากรายการไปยังแผนที่จากการคำนวณด้วยการปิดเพียงครั้งเดียว ... สิ่งที่ฉันกำลังมองหา
แก้ไข: สาเหตุที่ฉันไม่สามารถเพิ่มเมธอดในรายการอินเทอร์เฟซและคอลเล็กชันได้เนื่องจากฉันไม่ได้ทำสิ่งนี้:
List.metaClass.enableGlobally()
หลังจากการเรียกใช้เมธอดนั้นคุณสามารถเพิ่มเมธอดลงในอินเทอร์เฟซได้ .. ซึ่งในกรณีนี้หมายความว่าเมธอด collectMap ของฉันจะทำงานในช่วงเช่นนี้:
(0..2).collectMap{[it, it*2]}
ซึ่งให้ผลแผนที่: [0: 0, 1: 2, 2: 4]