Kotlin retourne, coupe, continue Mots-clés

Kotlin retour, pause, continue Mots-clés

1. Vue d'ensemble

Dans ce didacticiel, nous aborderons l'utilisation d'expressions de saut structurel dans Kotlin.

En termes simples,Kotlin has three structural jump expressions: return, break, continue. Dans les sections suivantes, nous aborderons leurs fonctionnalités avec et sans étiquette.

2. Étiquettes à Kotlin

Toutes les expressions en Kotlin peuvent être marquées avec une étiquette.

We create a label by using an identifier followed by the “@” sign. Par exemple,[email protected],[email protected] sont des étiquettes valides.

Pour étiqueter une expression, nous ajoutons simplement l'étiquette devant celle-ci:

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

3. L'instructionBreak

Sans étiquette,break termine la boucle englobante la plus proche.

Prenons un exemple:

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

Alternativement, nous pouvons utiliserbreak with a label, which terminates the loop marked with that label:

@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)
}

Dans ce cas, la boucle externe est terminée lorsque les variablesi etj sont respectivement égales à «b» et «1».

4. L'instructionContinue

Examinons ensuite le mot-clécontinue, que nous pouvons également utiliser avec ou sans libellé.

Sans étiquette,continue passera à l'itération suivante de la boucle englobante:

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

D'autre part,when we use continue with a label marking a loop, it will proceed to the next iteration of that loop:

@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)
}

Dans cet exemple, nous avons utilisécontinue pour ignorer une itération de la boucle intituléeouter_loop.

5. L'instructionReturn

Sans étiquette, ilreturns to the nearest enclosing function or anonymous function:

@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 est également utile lorsque nous voulonsapply continue logic on anonymousfunctions:

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

Dans cet exemple, l'instructionreturn retournera à l'appelant du fun anonyme, c'est-à-dire la boucleforEach.

In the case of a lambda expression, we can also use return with a label pour obtenir un résultat similaire:

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

Alternativement, nous pouvons aussireturn using an implicit label:

@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)
}

Dans l'exemple ci-dessus, l'instruction return retournera également à l'appelant du lambda - la boucleforEach.

Enfin,return peut être utilisé avec une étiquette versapply break logic to lambda expressions byreturning to a label outside:

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

6. Conclusion

Dans cet article, nous avons passé en revue les cas d'utilisation dereturn, break, continue dans Kotlin.

L'exemple de code a pu être trouvéover on Github.