You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:34:25