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: " + [email protected]_name
   if ([email protected]_name == targetDomain) {

    println "target domain matched: " + [email protected]_name

    domain.children().each {misc_field ->

     println "field_name: " + [email protected]_name
     println "field_type: " + [email protected]_type
     println "field_value: " + misc_field

    }



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

4 ответов

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 -> [email protected]_name == targetDomain }
result.children().each {
    // print stuff
}

SI des questions:

41
répondu Rob Hruska 2017-05-23 15:10:00
la source

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 14:47:10
la source

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-17 01:22:32
la source

je pense que ça devrait marcher aussi, s'arrêtant au premier match.

def result = records.children().find { domain -> 
    if ([email protected]_name == targetDomain) {
        // Do stuff
        ...
        return true
    } else {
        return false
    }
}
2
répondu Paull 2012-02-17 15:31:51
la source

Autres questions sur