est-il possible de sortir de fermeture en groovy
est-il un moyen de "casser" de groovy fermeture.
peut-être quelque chose comme ceci:
[1, 2, 3].each {
println(it)
if (it == 2)
break
}
Vous devez vous connecter pour publier un commentaire.
Vous pouvez jeter une exception:
Utilisation pourrait également utiliser des "findAll" ou "grep" pour filtrer votre liste, puis utilisez "chaque".
J'oublie souvent que Groovy met en œuvre un "tout" de la méthode.
Au 12/05/2013 Fortement Modifié.
De répondre à la question qui a été posée.
Vous "pause" d'une fermeture par l'émission de la
return
mot-clé. Cependant, ce n'est pas utile dans l'exemple qui est donné. La raison pour cela est que la fermeture (pensez-y comme une méthode) est appelée par leeach
méthode pour chaque élément de la collection.Si vous exécutez cet exemple, vous verrez qu'il aura l'impression 1 à 3.
Pourquoi
break
dans le contexte deeach
ne fait pas de sens.À comprendre pourquoi vous ne pouvez pas sortir de la
each
méthode que vous pouvez sortir d'unfor
boucle, vous devez comprendre un peu de ce qui se passe réellement. Ici est une grossière simplification de ce que chaque méthode sur une collection ne.Comme vous pouvez le voir, la fermeture est fondamentalement une méthode qui peut être passé autour. Tout comme en java, vous ne pouvez pas briser de l'intérieur de l'appel de méthode ou de la fermeture.
Quoi faire au lieu de casser de
each
.En Groovy, vous êtes censé exprimer votre code à l'aide des abstractions de haut niveau en tant que telle primitive de boucle n'est pas idiomatique. Pour l'exemple que vous avez donné, je voudrais envisager de faire usage de findAll. Par exemple:
J'espère que cela vous aide à comprendre ce qui se passe.
De répondre à la question sous entendue.
Vous ne pouvez pas sortir de la
each
méthode sans lancer et attraper une exception comme John Wagenleitner a dit. Bien que je dirais que lancer et attraper une exception dans le nom de contrôle de flux est une odeur de code et un collègue programmeur pourrait peut-être taper vos mains.return
est utilisé pour "break" d'une fermeture, puisque, comme mentionné ci-dessus, les fermetures en interne se traduire par une invocation de méthode.Prendre un coup d'oeil à Le meilleur modèle pour la simulation de continuer en groovy, fermeture pour une discussion approfondie.
Essayez d'utiliser tout au lieu de chaque
Le résultat : 1, 2, 3
Il existe une autre solution. Bien que, que groovy des trucs comme chaque/trouver/tout est assez cool: si elle ne rentre pas, ne l'utilisez pas. Vous pouvez toujours utiliser le bon vieux
Surtout, si vous voulez quitter la méthode, trop. Maintenant, vous êtes libre de les utiliser continuer/pause/retour que vous le souhaitez. Le code résultant peut ne pas être cool, mais c'est simple et compréhensible.
any
ici avecreturn true
être aussi simple que cela. Mais le point de fermetures, c'est qu'ils sont conçus pour être passé autour et manipulé. Pour un bon vieux travail, un bon vieil outil fera l'amende juste!C'est à l'appui de John Wagenleiter de réponse. Tigerizzy la réponse est simplement faux. Il peut facilement être réfutées, pratiquement, par l'exécution de son premier exemple de code, ou théoriquement par la lecture de Groovy de la documentation. Un retour renvoie une valeur (ou la valeur null sans argument) à partir de l'itération en cours, mais ne pas arrêter l'itération. Dans une clôture, il se comporte plutôt comme continuer.
Vous ne serez pas en mesure d'utiliser injecter sans cette compréhension.
Il n'y a aucun moyen de briser la boucle", sauf par la levée d'une exception. En utilisant les exceptions à cette fin est considéré comme une forte odeur. Donc, de même que Wagenleiter suggère, la meilleure pratique est de filtrer les éléments que vous souhaitez parcourir avant de lancer chaque ou l'un de ses cousins.
Juste à l'aide de la Fermeture
Avec rx-java vous pouvez transformer un objet iterable à un observable.
Ensuite, vous pouvez remplacer continuer avec un filtre et pause avec takeWhile
Voici un exemple: