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

    }



   }
  }
23
demandé sur Jack BeNimble 2009-11-20 01:10:06

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:

41
répondu Rob Hruska 2017-05-23 12:10:00

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"
4
répondu Alex Stoddard 2017-05-23 11:47:10

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
4
répondu Michal Z m u d a 2013-10-16 21:22:32

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
    }
}
2
répondu Paull 2012-02-17 11:31:51