Kotlin torna, interrompi, continua Parole chiave

1. Panoramica

In questo tutorial, discuteremo dell'uso delle espressioni di salto strutturale in Kotlin.

In poche parole, Kotlin ha tre espressioni di salto strutturali: ritorno, interruzione, continua. Nelle prossime sezioni, tratteremo le loro funzionalità con e senza un'etichetta.

2. Etichette in Kotlin

Qualsiasi espressione in Kotlin può essere contrassegnata con un'etichetta.

Creiamo un'etichetta utilizzando un identificatore seguito dal segno " @" . Ad esempio, [email protected] , [email protected] sono etichette valide.

Per etichettare un'espressione, aggiungiamo semplicemente l'etichetta davanti ad essa:

[email protected] for (i in 1..10) { // some code }

3. L' istruzione Break

Senza etichetta, break termina il ciclo di inclusione più vicino.

Diamo un'occhiata a un esempio:

@Test fun givenLoop_whenBreak_thenComplete() { var value = "" for (i in "hello_world") { if (i == '_') break value += i.toString() } assertEquals("hello", value) }

In alternativa, possiamo usare break con un'etichetta, che termina il ciclo contrassegnato con quell'etichetta:

@Test fun givenLoop_whenBreakWithLabel_thenComplete() { var value = "" [email protected] for (i in 'a'..'d') { for (j in 1..3) { value += "" + i + j if (i == 'b' && j == 1) [email protected]_loop } } assertEquals("a1a2a3b1", value) }

In questo caso, il ciclo esterno termina quando le variabili i e j sono uguali rispettivamente a "b" e "1".

4. L' istruzione Continua

Successivamente, diamo un'occhiata alla parola chiave continue , che possiamo anche usare con o senza un'etichetta.

Senza un'etichetta, continue procederà alla successiva iterazione del ciclo di inclusione:

@Test fun givenLoop_whenContinue_thenComplete() { var result = "" for (i in "hello_world") { if (i == '_') continue result += i } assertEquals("helloworld", result) }

D'altra parte, quando usiamo continue con un'etichetta che contrassegna un ciclo, procederà alla successiva iterazione di quel ciclo:

@Test fun givenLoop_whenContinueWithLabel_thenComplete() { var result = "" [email protected] for (i in 'a'..'c') { for (j in 1..3) { if (i == 'b') [email protected]_loop result += "" + i + j } } assertEquals("a1a2a3c1c2c3", result) }

In questo esempio, abbiamo usato continue per saltare un'iterazione del ciclo etichettato outer_loop.

5. La dichiarazione di ritorno

Senza etichetta, ritorna alla funzione di inclusione o alla funzione anonima più vicina:

@Test fun givenLambda_whenReturn_thenComplete() { var result = returnInLambda(); assertEquals("hello", result) } private fun returnInLambda(): String { var result = "" "hello_world".forEach { if (it == '_') return result result += it.toString() } //this line won't be reached return result; }

Return è utile anche quando vogliamo applicare la logica continua su funzioni anonime :

@Test fun givenAnonymousFunction_return_thenComplete() { var result = "" "hello_world".forEach(fun(element) { if (element == '_') return result += element.toString() }) assertEquals("helloworld", result) }

In questo esempio, l' istruzione return tornerà al chiamante del divertimento anonimo, cioè il ciclo forEach .

Nel caso di un'espressione lambda, possiamo anche usare return con un'etichetta per ottenere un risultato simile:

@Test fun givenLambda_whenReturnWithExplicitLabel_thenComplete() { var result = "" "hello_world".forEach [email protected]{ if (it == '_') { [email protected] } result += it.toString() } assertEquals("helloworld", result) }

In alternativa, possiamo anche restituire utilizzando un'etichetta implicita :

@Test fun givenLambda_whenReturnWithImplicitLabel_thenComplete() { var result = "" "hello_world".forEach { if (it == '_') { // local return to the caller of the lambda, i.e. the forEach loop [email protected] } result += it.toString() } assertEquals("helloworld", result) }

Nell'esempio sopra, l'istruzione return tornerà anche al chiamante del lambda, il ciclo forEach .

Infine, return può essere utilizzato con un'etichetta per applicare la logica di interruzione alle espressioni lambda tornando a un'etichetta all'esterno :

@Test fun givenAnonymousFunction_returnToLabel_thenComplete() { var result = "" run [email protected]{ "hello_world".forEach { if (it == '_') [email protected] result += it.toString() } } assertEquals("hello", result) }

6. Conclusione

In questo articolo, abbiamo esaminato i casi d'uso di reso, interruzione, continuazione in Kotlin.

Il codice di esempio può essere trovato su GitHub.