2012-10-30 2 views
8

Bitte erläutern Sie, warum dies nicht funktioniert (Groovy 2.0.5 auf JDK7). Ich möchte nur einige Karteneinträge aus einer Liste hinzufügen.Groovy - Hinzufügen eines Karteneintrags mit Iterator

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  <- ? 
*/ 

Es ist auch mit nicht funktioniert:

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

Aber es funktioniert mit:

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

???

Antwort

13

Diese

map << [it:"value"] 

verwendet einfach einen Schlüssel it genannt. Wenn Sie es in Klammern wickeln:

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

Es funktioniert, wie man wollte ...

Wenn Sie:

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

Dann können Sie sehen, dass Sie ein GStringImpl: als Schlüssel anstatt ein java.lang.String

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

(Paketnamen der Kürze halber weggelassen)

Sie versuchen dann, und einen GString Schlüssel mit einem String nachzuschlagen, und dies nicht gelingt (siehe die 'gstrings sind nicht Strings' Abschnitt on this page)

Dies funktioniert:

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

da es nur einen String erzeugt (durch it auf den leeren String anhängt)

wie dem auch sei ... lange Geschichte kurz verwenden [(it):'value']