Pouvez-vous briser à partir d'un Groovy “chaque” fermeture"?
Est-il possible de break
de Groovy .each{Closure}
, ou devrais-je être l'aide d'un classique de la boucle à la place?
Vous devez vous connecter pour publier un commentaire.
Est-il possible de break
de Groovy .each{Closure}
, ou devrais-je être l'aide d'un classique de la boucle à la place?
Vous devez vous connecter pour publier un commentaire.
Non, vous ne pouvez pas annuler un "chaque" sans lancer une exception. Vous souhaitez probablement un classique de la boucle si vous voulez la pause pour interrompre sous une certaine condition.
Sinon, vous pouvez utiliser un "trouver" fermeture " au lieu d'un chacun, et retourne true lorsque vous avez fait une pause.
Cet exemple s'arrêtera avant le traitement de l'ensemble de la liste:
Imprime
mais ne s'imprime pas 6 ou 7.
Il est également très facile d'écrire votre propre itérateur méthodes personnalisées de briser comportement qui acceptent fermetures:
Imprime aussi:
find
mieux queany
- voir la réponse ci-dessous à partir de @Michal que l'on travaille pour moidef test = [2] test.findResult{ it * 2 }
sera de retour du 4 au lieu de 2Remplacer chaque boucle avec tout fermeture.
Sortie
any()
de cette façon est un peu trompeur, mais il fonctionne et vous donne la possibilité de break ou continuer.Non, vous ne pouvez pas casser à partir d'une clôture en Groovy, sans lever une exception. Aussi, vous ne devriez pas utiliser les exceptions pour le contrôle de flux.
Si vous vous trouvez vouloir sortir de la fermeture, vous devriez d'abord penser à pourquoi vous voulez faire cela, et non pas comment le faire. La première chose à considérer pourrait être le remplacement de la clôture en question avec l'un de Groovy est (conceptuel) et des fonctions d'ordre supérieur. L'exemple suivant:
devient
devient
ce qui permet également de clarté. Il indique l'intention de votre code de beaucoup mieux.
L'inconvénient potentiel dans les exemples, c'est que itération s'arrête uniquement au début du premier exemple. Si vous avez des facteurs de performance, vous voudrez peut-être arrêter à droite, puis et là.
Toutefois, pour la plupart des cas qui impliquent des itérations vous pouvez généralement recourir à l'un de Groovy find, grep, de recueillir, d'injecter, etc. des méthodes. Ils ont l'habitude de prendre des "configuration" puis sur "savoir" comment faire de l'itération pour vous, de sorte que vous pouvez effectivement éviter impératif de boucle dans la mesure du possible.
Juste à l'aide de la Fermeture
(1..10).chaque{
si (il < 5)
println il
d'autre
return false
each
, il suffit simplement de ne pas imprimer les valeurs supérieures à 4. Leelse
est superflu, votre code devrait faire la même chose sans elle. Aussi, vous pouvez prouvereach
ne pas rompre avecreturn false
si vous mettezprintln "not breaking"
juste aprèselse
et juste avantreturn false
.Vous pourriez casser par
RETURN
. Par exempleÇa marche pour moi!
any
méthode de la matrice par le retourfalse
. Vous ne pouvez pas brisereach
méthode de la même manière.