9

请解释一下,为什么这不起作用(JDK7 上的 Groovy 2.0.5)。我只想从列表中添加一些地图条目。

def map = new HashMap<String,String>()
map << ["key":"value"]

def list = ["a","b","c"]
list.each {
    map << [it:"value"]
}
println map
println map.a
println map.containsKey("a")

/*
[key:value, a:value, b:value, c:value]
null        <- ?
false       <- ?
*/

它也不适用于:

map << ["$it":"value"]

但它正在与:

map << [(""+it):"value"]

???

4

1 回答 1

14

这个

map << [it:"value"]

只需使用一个名为it. 如果你用括号括起来:

map << [(it):"value"]

它可以按您的意愿工作...

如果你这样做:

map << ["$it":"value"]

然后,您可以看到您有一个GStringImpl: 作为键而不是java.lang.String

println map.keySet()*.getClass().name
// prints [GStringImpl, GStringImpl, String, GStringImpl ]

(为简洁起见省略了包名)

然后,您尝试使用字符串查找 GString 键,但失败(请参阅此页面上的“GStrings 不是字符串”部分)

这有效:

map << [(""+it):"value"]

因为它只是创建一个字符串(通过附加it到空字符串)

无论如何......长话短说,使用[(it):'value']

于 2012-10-30T13:00:43.093 回答