我有以下列表: appList = [DevOpsApplication,01.01.01]
我想使用collectEntries
创建地图。我知道it
是指迭代的当前元素({ it -> it }
的快捷方式)。因此,我尝试使用索引:
def appMap = appList.collectEntries { [(it[0]):it[1]] }
但是,这给了我
[D:e, 0:1]
但是我想要[DevOpsApplication: 01.01.01]
。有办法吗?
此外,将来我希望将其扩展到2个以上的元素(例如[DevOpsApplication, 01.01.01, AnotherDevOpsApplication, 02.02.02]
),并具有所需的[DevOpsApplication: 01.01.01, AnotherDevOpsApplication: 02.02.02]
输出。
这怎么可能?
答案 0 :(得分:2)
您要逐个元素地进行迭代,并且(因为您的元素是String
类型的)将0
子字符串映射到1
子字符串。
您可以使用它在每次迭代中跳过一个元素,并将每个元素的偶数索引映射到其后的元素:
def appList = ['DevOpsApplication', '01.01.01']
def appMap = (0..(appList.size()-1)).findAll{0 == it%2}
.collectEntries{[(appList[it]): appList[it+1]]}
这将按预期返回[DevOpsApplication:01.01.01]
。
答案 1 :(得分:2)
一个非常简短的版本是:
def appList = ["DevOpsApplication", "01.01.01"]
def appMap = [appList].collectEntries() // XXX
assert appMap == [DevOpsApplication: "01.01.01"]
它是如何工作的:函数collectEntries
会返回地图或两个元素列表。您的appList
已经是。因此,将其放在另一个列表中,在其上调用collectEntries
。如果没有为collectEntries
提供任何功能,它将使用身份功能。
奖金:如果appList
有更多元素怎么办?您可以使用collate
来构建元组。
def appList = ["DevOpsApplication", "01.01.01", "Some", "More"]
def appMap = appList.collate(2).collectEntries() // XXX
assert appMap == [DevOpsApplication: "01.01.01", Some: "More"]
答案 2 :(得分:1)
我还找到了另一种方法。 Groovy可以转换Object数组的值,并使用toSpreadMap()
将它们转换为映射。但是,数组必须具有偶数个元素。
def appList = ['DevOpsApplication', '01.01.01']
def appMap = appList.toSpreadMap()