Kotlin hat sehr schöner Iterieren Funktionen, wie forEach
oder repeat
, aber ich bin nicht in der Lage das zu machen break
und continue
mit ihnen Operatoren arbeiten (sowohl lokale als auch nicht-lokal):
repeat(5) {
break
}
(1..5).forEach {
continue@forEach
}
Das Ziel ist es, übliche Schleifen mit der funktionalen Syntax so nah wie möglich nachzuahmen. In einigen älteren Versionen von Kotlin war dies definitiv möglich, aber ich habe Schwierigkeiten, die Syntax zu reproduzieren.
Das Problem könnte ein Fehler mit Labels (M12) sein, aber ich denke, dass das erste Beispiel trotzdem funktionieren sollte.
Es scheint mir, dass ich irgendwo über einen speziellen Trick / eine spezielle Anmerkung gelesen habe, aber ich konnte keine Referenz zu diesem Thema finden. Könnte wie folgt aussehen:
public inline fun repeat(times: Int, @loop body: (Int) -> Unit) {
for (index in 0..times - 1) {
body(index)
}
}
continue@label
undbreak@label
Funktionen warten ), siehe verwandte Frage: stackoverflow.com/questions/34642868/…break
undcontinue
für Funktionsschleifen fragen oder ob Sie nach alternativen Antworten suchen, die genau dasselbe tun. Ersteres scheint der Fall zu sein, weil Sie Letzteres abgelehnt haben.Antworten:
Bearbeiten :
Laut Kotlins Dokumentation ist es möglich, Anmerkungen zu verwenden.
Ursprüngliche Antwort :
Da Sie a angeben
(Int) -> Unit
, können Sie nicht davon abbrechen, da der Compiler nicht weiß, dass es in einer Schleife verwendet wird.Sie haben wenige Möglichkeiten:
Verwenden Sie eine reguläre for-Schleife:
Wenn die Schleife der letzte Code in der Methode ist
, können Sie
return
die Methode verlassen (oderreturn value
wenn es sich nicht um eineunit
Methode handelt).Verwenden einer Methode
Erstellen Sie eine benutzerdefinierte Methode
Boolean
für Wiederholungsmethoden, die zum Fortfahren zurückgegeben wird.quelle
break
und arbeitencontinue
nur in Schleifen.forEach
,repeat
Und alle anderen Methoden sind genau das: Methoden und nicht - Schleifen. Yoav präsentierte einige Alternativen aberbreak
undcontinue
sind einfach nicht an die Arbeit für Methoden ment.continue@label
undbreak@label
Funktionen warten ), siehe verwandte Frage: stackoverflow.com/questions/34642868/…Dies gibt 1 bis 5 aus. Das
return@forEach
Verhalten verhält sich wie das Schlüsselwortcontinue
in Java, was in diesem Fall bedeutet, dass immer noch jede Schleife ausgeführt wird, aber zur nächsten Iteration gesprungen wird, wenn der Wert größer als 5 ist.Dies gibt 1 bis 10 aus, überspringt jedoch 5.
Probieren Sie sie auf dem Kotlin Playground aus .
quelle
continue
und einembreak
Beispiel: pl.kotl.in/_LAvET-wXEine Pause kann erreicht werden mit:
Und eine Fortsetzung kann erreicht werden mit:
Wie hier jeder empfiehlt ... lesen Sie die Dokumente: P https://kotlinlang.org/docs/reference/returns.html#return-at-labels
quelle
@loop
das gleiche gewünschte Ergebnis erzielt.Sie können den Ausdruck return from lambda verwenden, der a
continue
oderbreak
abhängig von Ihrer Verwendung nachahmt .Dies wird in der entsprechenden Frage behandelt: Wie mache ich eine "Pause" oder "Fortsetzung", wenn ich mich in einer Funktionsschleife innerhalb von Kotlin befinde?
quelle
Wie in der Kotlin-Dokumentation angegeben ,
return
ist die Verwendung der richtige Weg. Das Gute an Kotlin ist, dass Sie, wenn Sie verschachtelte Funktionen haben, Labels verwenden können, um explizit zu schreiben, woher Ihre Rückkehr stammt:Rückgabe des Funktionsumfangs
und Local Return (es hört nicht auf, forEach = Fortsetzung durchzugehen)
Kasse die Dokumentation, es ist wirklich gut :)
quelle
forEach
continue
Verhalten eingeben inforEach
Für das
break
Typverhalten müssen Sie verwendenfor in until
oderfor in
gemäß der Liste istNullable
oderNon-Nullable
Für nullbare Liste:
Für nicht nullbare Liste:
quelle
Break-Anweisung für verschachtelte Schleifen forEach ():
Ergebnis:
Fortsetzung der Anweisung mit anonymer Funktion:
Ergebnis:
quelle
vielleicht für jeden ändern
Es funktioniert für Hashmaps
quelle