变换地图列表

时间:2014-11-10 03:05:25

标签: arraylist groovy

我有一个这样的数组:

def array = [[firstName:Nick], [lastName:Peter], [age:30]]

现在我想将其转换为:

def array = [firstName:Nick, lastName:Peter, age:30]

任何帮助将不胜感激。 感谢。

4 个答案:

答案 0 :(得分:4)

在groovy中添加地图会导致相同的行为。这样,地图列表的总和就会得到相同的结果:

def listOfMaps = [[firstName:'Nick'], [lastName:'Peter'], [age:30]]
assert [firstName:'Nick', lastName:'Peter', age:30] == listOfMaps.sum()

答案 1 :(得分:1)

你可以这样做......

def resultMap = [:]
def listOfMaps = [[firstName:'Nick'], [lastName:'Peter'], [age:30]]
listOfMaps.each {
    resultMap << it
}

assert resultMap == [firstName: 'Nick', lastName: 'Peter', age: 30]

你在寻找类似的东西吗?

修改

要在下面的评论中提出问题......

def resultMap = [:]
def listOfMaps = [[firstName:'Nick'], [lastName:'Peter'], [age:30]]
listOfMaps.each {
    resultMap << it
}

assert resultMap == [firstName: 'Nick', lastName: 'Peter', age: 30]

println "First Name: ${resultMap.firstName}"
println "Last Name: ${resultMap.lastName}"
println "Age: ${resultMap.age}"

输出如下:

First Name: Nick
Last Name: Peter
Age: 30

答案 2 :(得分:1)

试试这个:

​def array = [[firstName:'Nick'], [lastName:'Peter'], [age:30]]​​​​​​
def res = [:];
array.each() { 
    res << it
}
print res​

答案 3 :(得分:0)

您可以使用许多有用的Groovy Collections来获得结果。

这是一个使用inject,使用空映射初始化,然后在列表的每次迭代中添加它的版本。

def s = listOfMaps.inject([:]) { acc, v -> acc += v; acc }

这可以通过添加到地图,然后将其作为下一次迭代的最后一个值返回。

更短:

def s = listOfMaps.inject([:]) { acc, v -> acc + v }

这是有效的,因为价值&#34; acc + v&#34;也是一个地图,并返回下一次迭代。这里根本没有变异。

Inject是其他语言(如clojure)中reduce的功能等同物。我喜欢这样做,因为它创建了结果,而不是创建一个空地图然后改变它。