Groovy - comment sortir de chaque boucle?
je suis nouveau Graal/Groovy et essaie de trouver un nœud dans un fichier xml, j'ai compris comment itérer sur tous les d'eux, mais je veux sortir de la boucle lorsque le nœud cible est trouvée. J'ai lu qu'au lieu d'utiliser "chacun", utilisez "find", mais les exemples de find que j'ai vus sont des conditions. Maintenant la logique que j'ai va parcourir le fichier en entier sans sortir. Le code est le suivant:
records.children().each {domain ->
println "domain_name: " + domain.@domain_name
if (domain.@domain_name == targetDomain) {
println "target domain matched: " + domain.@domain_name
domain.children().each {misc_field ->
println "field_name: " + misc_field.@field_name
println "field_type: " + misc_field.@field_type
println "field_value: " + misc_field
}
}
}
4 réponses
vous ne pouvez pas le faire avec élégance. Vous pourriez voir certaines personnes suggèrent de jeter une Exception, mais c'est juste tout laid .
voici quelques discussion de la liste de diffusion sur l'utilisation de each
vs. for
, et un couple les gens disent que for
est préférable en raison de each
l 'incapacité de rompre de l'itération.
votre meilleur pari est probablement de passer à un for
boucle et itérate:
for(def domain : records.children()) { // this may need some tweaking depending on types
// do stuff
if(condition) {
break;
}
}
soit cela, soit comme vous l'avez dit, peut-être utiliser trouver ou findAll pour trouver l'élément que vous recherchez (le code suivant est paraphrasé, Je n'ai pas encore le temps de le tester):
def result = records.children().find { domain -> domain.@domain_name == targetDomain }
result.children().each {
// print stuff
}
SI des questions:
en ce qui concerne la sortie de chaque boucle voir: est-il possible de "sortir" d'une fermeture groovy
fondamentalement, vous devez jeter et exception et l'attraper. Le mot-clé" break " n'est autorisé que dans les boucles non itérées "closures" (vraiment des blocs de code).
vous pouvez utiliser n'importe quel code complexe avec" find " juste s'assurer que la fonction que vous appelez retourne un booléen. Par exemple:
Boolean test(val) {
println "Testing $val"
return val == 1
}
def found = [3,4,5,1,6,3].find { test(it) }
println "Found $found"
remplacer par ou trouver fermeture.
def list = [1, 2, 3, 4, 5]
list.any { element ->
if (element == 2)
return // continue
println element
if (element == 3)
true // break
}
Sortie
1
3
je pense que ça devrait marcher aussi, s'arrêtant au premier match.
def result = records.children().find { domain ->
if (domain.@domain_name == targetDomain) {
// Do stuff
...
return true
} else {
return false
}
}