Groovy列表转Map仅生成2个键值对,如何获取完整6个键值对?
问题分析与解决方案
哦,我一眼就看到问题啦——你代码里的transpose少了括号!Groovy里调用无参方法的时候,虽然部分场景可以省略括号,但transpose是List的方法,直接写[listA, listB].transpose得到的是方法引用对象,而不是转置后的列表!这就导致后续的each遍历根本没处理你预期的6组键值对,自然得到了错误的结果。
修正后的代码
你只需要给transpose加上括号,让它实际执行转置操作,然后再把转置后的列表转成Map就行:
def listA = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR'] def listB = [1,2,1,1,1,1] def pairs = [listA, listB].transpose() // 这里加上括号! def map = [:] pairs.each{ map << (it as MapEntry) } println(map)
运行这段代码,就能得到你想要的结果:[ABC:1, DEF:2, GHI:1, JKL:1, MNO:1, PQR:1]
更简洁的写法
其实Groovy有更优雅的方式直接生成Map,用collectEntries方法一步到位,省去手动遍历的步骤:
def listA = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR'] def listB = [1,2,1,1,1,1] def map = [listA, listB].transpose().collectEntries() println(map)
为什么原来的代码会得到[ABC:1, DEF:1]?
因为你没有调用transpose方法,而是把方法本身赋值给了pairs。当你对这个方法引用执行each时,Groovy会尝试遍历方法的某些内部属性(比如参数信息),这就意外地生成了两个MapEntry,最终得到了那个不符合预期的小Map。只要加上括号让方法执行,就能得到正确的键值对列表啦。
内容的提问来源于stack exchange,提问作者street_jesus
相关产品推荐
相关产品推荐

