2010-09-14 6 views
2

C'est OKtrès simple groovy, question de la carte et la fermeture, mais ce que je fais mal

def variables=[ 
       ['var1':'test1'], 
       ['var2':'test2'], 
       ['var3':'test3'] 
       ] 

println "${variables.size()}" 
variables.each{entry -> 
    println "${entry} " 
} 

Je suis:

3 
[var1:test1] 
[var2:test2] 
[var3:test3] 

mais cela a causé des problèmes

def variables=[ 
        ['var1':'test1'], 
        ['var2':'test2'], 
        ['var3':'test3'] 
        ] 

    println "${variables.size()}" 
    variables.each{entry -> 
     println "${entry.key} " 
    } 

depuis que j'ai:

3 
null 
null 
null 

J'attends:

3 
var1 
var2 
var3 

ce qui ne va pas avec mon code?

merci !!!

Répondre

1

Vous voulez:

def variables=[ 
    'var1':'test1', 
    'var2':'test2', 
    'var3':'test3' 
] 

println variables.size() 
variables.each{entry -> 
    println entry.key 
} 

Avant que vous aviez un ArrayList contenant trois objets LinkedHashMap. Le code ci-dessus est un seul LinkedHashMap avec trois entrées. Vous n'avez pas non plus besoin d'interpolation de chaîne, donc je l'ai enlevé.

0

La solution de Matthew fonctionne très bien, et c'est probablement ce que vous vouliez (une structure de données plus simple pour commencer).

Cependant, si vous vouliez vraiment variables être une liste de trois cartes (selon votre question), alors ce que vous pourriez obtenir votre sortie désirée:

def variables=[ 
     ['var1':'test1'], 
     ['var2':'test2'], 
     ['var3':'test3'] 
] 

println "${variables.size()}" 

variables.each{ entry-> 
    entry.each { 
     println it.key 
    } 
} 

la fermeture extérieure, chaque entry est une carte. Nous parcourons donc chacune de ces cartes en utilisant la fermeture interne. Dans cette fermeture interne, chaque it closure-param est une paire clé/valeur, donc nous imprimons simplement sa clé en utilisant it.key.

Comme Matthew, j'ai également supprimé l'interpolation de chaîne car vous n'en avez pas besoin.

Questions connexes