Kotlin a de très belles fonctions d'itération, comme forEach
ou repeat
, mais je ne suis pas en mesure de faire fonctionner les opérateurs break
et continue
avec eux (à la fois locaux et non locaux):
repeat(5) {
break
}
(1..5).forEach {
continue@forEach
}
Le but est d'imiter les boucles habituelles avec la syntaxe fonctionnelle aussi proche qu'elle pourrait l'être. C'était certainement possible dans certaines anciennes versions de Kotlin, mais j'ai du mal à reproduire la syntaxe.
Le problème pourrait être un bug avec les étiquettes (M12), mais je pense que le premier exemple devrait quand même fonctionner.
Il me semble que j'ai lu quelque part sur une astuce / annotation spéciale, mais je n'ai trouvé aucune référence sur le sujet. Cela pourrait ressembler à ce qui suit:
public inline fun repeat(times: Int, @loop body: (Int) -> Unit) {
for (index in 0..times - 1) {
body(index)
}
}
continue@label
etbreak@label
), voir la question associée: stackoverflow.com/questions/34642868/...break
etcontinue
pour les boucles fonctionnelles, ou si vous recherchez des réponses alternatives qui font exactement la même chose. Le premier semble être le cas, car vous avez rejeté le second.Réponses:
Edit :
Selon la documentation de Kotlin , il est possible d'utiliser des annotations.
Réponse originale :
Puisque vous fournissez a
(Int) -> Unit
, vous ne pouvez pas vous en séparer, car le compilateur ne sait pas qu'il est utilisé dans une boucle.Vous avez quelques options:
Utilisez une boucle for régulière:
Si la boucle est le dernier code de la méthode,
vous pouvez utiliser
return
pour sortir de la méthode (oureturn value
si ce n'est pas uneunit
méthode).Utiliser une méthode
Créez une méthode de méthode de répétition personnalisée qui renvoie
Boolean
pour continuer.la source
break
etcontinue
ne fonctionnent que par boucles.forEach
,repeat
et toutes les autres méthodes ne sont que cela: des méthodes et non des boucles. Yoav a présenté quelques alternatives maisbreak
et necontinue
sont tout simplement pas à travailler pour les méthodes.continue@label
etbreak@label
), voir la question associée: stackoverflow.com/questions/34642868/...Cela affichera 1 à 5. Il
return@forEach
agit comme le mot-clécontinue
en Java, ce qui signifie que dans ce cas, il exécute toujours chaque boucle mais passe à l'itération suivante si la valeur est supérieure à 5.Ceci imprimera 1 à 10 mais sautera 5.
Essayez-les au Kotlin Playground .
la source
continue
et unbreak
exemple: pl.kotl.in/_LAvET-wXUne pause peut être obtenue en utilisant:
Et une poursuite peut être réalisée avec:
Comme tout le monde le recommande ici ... lisez la documentation: P https://kotlinlang.org/docs/reference/returns.html#return-at-labels
la source
@loop
donne également le même résultat souhaité.transform
où vous pouvez casser sous certaines conditions, ex.reduceReturnIf(acc, value, returnIf: func)
Vous pouvez utiliser le retour de l'expression lambda qui imite un
continue
ou enbreak
fonction de votre utilisation.Ceci est couvert dans la question connexe: Comment faire une "pause" ou "continuer" lorsque je suis dans une boucle fonctionnelle dans Kotlin?
la source
Comme le dit la documentation Kotlin , utiliser
return
est la voie à suivre. La bonne chose à propos de kotlin est que si vous avez des fonctions imbriquées, vous pouvez utiliser des étiquettes pour écrire explicitement d'où vient votre retour:Fonction Scope Return
et Local Return (il n'arrête pas de passer par forEach = continuation)
Consultez la documentation, c'est vraiment bien :)
la source
forEach
continue
comportement de type dansforEach
pour le
break
comportement de type que vous devez utiliserfor in until
oufor in
selon la liste estNullable
ouNon-Nullable
Pour la liste Nullable :
Pour les listes non nulles :
la source
Instruction Break pour les boucles imbriquées forEach ():
Résultat:
Continuez l'instruction avec la fonction anonyme:
Résultat:
la source
peut-être changer pour
ça marche pour les hashmaps
la source
Je sais que cela n'est peut-être pas exactement lié à la pause
forEach
, mais depuis1.3.70
, nous l'avons faitscan
pour que nous puissions au moins obtenir les résultats intermédiaires.Alors maintenant, si vous pouvez assembler tous les résultats (similaires à
map
) dont vous pourriez ne pas avoir besoin, mais si vous l'autorisez à se terminer, vous pouvez ignorer la pause et simplement vérifier le tableau final.À mon humble avis, la programmation fonctionnelle de base ne tient pas vraiment compte de l'
transform
opération qui doit sauter au milieu sans la terminer. Afin de vraiment résoudre ce problème, nous devons construire une fonction qui prend en compte la condition de retour, ex.la source