2012-10-30 53 views
8

請解釋爲什麼這不起作用(JDK7上的Groovy 2.0.5)。我只想從列表中添加一些地圖條目。Groovy - 使用迭代器添加映射條目

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"] 

???

回答

13

map << [it:"value"] 

只需使用一個名爲it關鍵。如果你用小括號括它:

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

它可以作爲你想...

如果你:

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

然後,你可以看到你有一個GStringImpl:作爲密鑰,而不是一個java.lang.String

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

(包名爲簡潔起見省略)

然後,你試着尋找了一個String一個GString的關鍵,而這個失敗(見'GString的不是字符串'部分on this page

這工作:

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

由於它只是創建一個字符串(通過附加it爲空字符串)

反正......長話短說,使用[(it):'value']