在Groovy中使用CollectEntries创建地图

时间:2019-04-29 06:36:43

标签: groovy

我有以下列表:     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]输出。 这怎么可能?

3 个答案:

答案 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()