使用每个闭包将地图添加到列表的问题

时间:2016-04-02 05:58:05

标签: groovy

我正在尝试使用每个闭包将地图添加到列表中。样本就像这样

def list = [1, 2, 3, 4]
def titles = []
def map = [:]
list.each{
   map.put('index', xxxx)
   map.put('title', xxxxx)
   titles.add(map)
}

如果我打印最终切片列表的值,我会注意到地图项只重复列表中第一项的值。看起来地图只会覆盖原始列表中第一个项目的值。

为什么会发生这种情况以及获取地图正确值的方法是什么

2 个答案:

答案 0 :(得分:2)

每次添加相同的地图实例,然后每个循环更改所有这些实例

在每个闭包内移动def map = [:]

答案 1 :(得分:1)

正如另一张海报评论的那样,你需要在每个闭包内实例化一个新的地图。但是,你可以做更多这样的事情' Groovier'像这样:

def list = [1, 2, 3, 4]
def titles = []

list.each{ value -> titles << ['index':'xxx', 'title':'xxxx'] }

在您的示例中,您在迭代时甚至没有使用列表中的值。如果您只是想强制它处理特定次数的迭代,您可以将其更改为:

def titles = []
list.each{ value -> titles << ['index':'xxx', 'title':'xxxx'] }

或者更简单地说,使用范围:

(1..4)*.collect{ idx -> ['index':idx, 'title':"$idx:xxxx"] }.flatten()

生成地图列表:

[[index:1, title:1:xxxx], [index:2, title:2:xxxx], [index:3, title:3:xxxx], [index:4, title:4:xxxx]]