Wie mache ich eine "Pause" oder "fortsetzen", wenn Sie in eine funktionelle Schleife in Kotlin?
In Kotlin, ich kann nicht ein break
oder continue
innerhalb einer Funktion loop und meine lambda -- wie kann ich aus einer normalen for
Schleife. Zum Beispiel funktioniert nicht:
(1..5).forEach {
continue@forEach //not allowed, nor break@forEach
}
Gibt es alte Dokumentation, dass dies erwähnt wird verfügbar, aber es scheint, dass es nie umgesetzt wurde. Was ist der beste Weg, um das gleiche Verhalten, wenn ich will continue
oder break
innerhalb der lambda?
Hinweis: diese Frage ist absichtlich geschrieben und beantwortet der Autor (Selbst Beantwortete Fragen), so dass die idiomatischen Antworten auf Häufig gestellte Kotlin Themen vorhanden sind, SO. Auch zu klären, einige wirklich alte Antworten geschrieben alphas Kotlin, die nicht korrekt für den aktuellen Tag Kotlin.
- Hinweis: es ist gut zu erwähnen(IDE Android studio vielleicht Intellij auch) nicht angezeigt, eine Warnung, wenn ein return@forEach in der letzten Zeile der forEach-Funktion lambda.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt andere Optionen, andere als das, was Sie fordern, die ähnliche Funktionalität bieten. Zum Beispiel:
Können Sie vermeiden, Verarbeitung, einige Werte mit
- filter
: (wie eincontinue
)Können Sie aufhören, eine funktionelle Schleife, die durch die Verwendung
takeWhile
: (wie einbreak
)Komplexer, obwohl unsinnige Beispiel, wo Sie wollen, zu tun, einige Bearbeitung, überspringen einige der sich ergebenden Werte, und dann stoppen an einer Reihe von verschiedenen Bedingungen, wäre:
Einer Kombination dieser Funktionen neigt dazu, die Notwendigkeit beseitigen, für
continue
oderbreak
. Und es gibt unendlich viele verschiedene Möglichkeiten hier, und mehr als die dokumentiert werden können. Um eine Vorstellung zu bekommen, was getan werden kann, ist es am besten, wenn Sie lernen, alle verfügbaren Funktionen in der Kotlin-standard-Bibliothek für Sammlungen, faul Sequenzen, und durchsuchbar.Manchmal gibt es Fälle, wo Sie mutierend Zustand, muss noch
break
odercontinue
und ist schwer zu tun, in einem funktionalen Modell. Sie können es machen das arbeiten mit komplexeren Funktionen wiefold
undreduce
kombiniert mit derfilter
undtakeWhile
Funktionen, aber das ist manchmal schwerer zu verstehen. Daher, wenn Sie wirklich wollen, dass das genaue Verhalten können Sie Rückkehr aus lambda-Ausdruck imitiert einecontinue
oderbreak
je nach Nutzung.Hier ist ein Beispiel der Nachahmung
continue
:Und Sie können gehen, komplizierter und Etiketten verwenden, wenn Sie unter Schachteln oder unübersichtlichen Situationen:
Wenn Sie wollen, eine
break
müssen Sie etwas außerhalb der Schleife, dass Sie zurückkehren können, aus, hier verwenden wir dierun()
- Funktion, um uns zu helfen:Statt
run()
könnte es seinlet()
oderapply()
oder etwas selbstverständlich haben Sie rund um dieforEach
ist ein Ort, den Sie möchten, zu brechen. Aber Sie wird auch überspringen Sie den code innerhalb des gleichen Blocks nach derforEach
so vorsichtig sein.Diese sind inline-Funktionen, so wirklich Sie tun nicht wirklich hinzufügen overhead.
Lesen Sie die Kotlin-Referenz-Dokumentation für Zurück und Springt für alle besonderen Fällen auch für anonyme Funktionen.
Hier ist ein unit-test beweist das alles funktioniert:
takeWhile stdlib-Funktion kann verwendet werden, anstelle der Pause.
Beispielsweise
forEach
mit break können Sie angeben, ersetzt mit jeder Funktion:Oder möglicherweise noch kürzer:
any
Funktion, die ausgelegt ist, um nur zu finden, wenn eine Bedingung existiert, in der Sequenz und Rückgabe true/false wenn dem so ist, endet so früh wie möglich. Es ist nicht ausgelegt für die Bearbeitung verwendet werden, noch verwendet werden kann, in der Mitte eine funktionale Kette, aber eher nur am Ende.Wenn es einen Bedarf zu verwenden
continue
oderbreak
ist es nicht ideal, umforEach
im Vergleich zu normalenfor-loop
Wenn Sie wirklich, wie Sie an die Kette den Befehl ein, und führen Sie wie eine for-Schleife, verwenden Sie die normale funktionale Kette, statt
forLoop
E. g. für
Verwenden
map
als for-SchleifefilterNot
so weiter, undasSequence() & first
zur Pausefirst
ist irreführend, da gibt es den Wert, statt einfach beenden der Schleife und mit der Bearbeitung nach. Es ist nicht das gleiche wie eine Pause.asSequence()
. Dieser hört die Schleife auf, es zu finden. Bitte überprüfen Sie medium.com/@elye.project/... um zu verstehen, die unterschiedliche Verarbeitung zwischen der Liste und der Reihenfolgefirst
ist "Gibt das erste element, passend zu den gegebenen Prädikat" nicht "weiter, während ein Prädikat wahr ist", dietakeWhile
first
wirft eine exception, falls nicht gefunden, das macht es weniger wiebreak
als auch die falsche Beschreibung. Es ist keine gute Allzweck-Ersatz fürbreak
.map
wenn Sie sollten mitonEach
seine Stelle oder nach einertakeWhile { it != 60 }
eineforEach
.