[2023] Tutorial de Kotlin Parte 2 Programación funcional y orientada a objetos Capítulo 13 Piedra angular de la programación funcional: funciones de orden superior y expresiones lambda 13.4 Cierres y captura de variables

[2023] Tutorial de Kotlin

inserte la descripción de la imagen aquí

Parte II Programación Funcional y Orientada a Objetos

Capítulo 13 La piedra angular de la programación funcional: funciones de orden superior y expresiones lambda

Aunque la idea de la programación funcional es tan antigua como la orientada a objetos, el lenguaje informático que soporta la programación funcional es solo una cuestión de los últimos años. Estos lenguajes incluyen Swift, Python, Java 8 y C++ 11. Como lenguaje nuevo, Kotlin también es compatible con la programación funcional.

13.4 Cierres y variables de captura

Closure (cierre) es una función especial que puede acceder a variables fuera del cuerpo de la función.Esta variable existe con la función, incluso si ha salido de su alcance original. Tales funciones especiales son generalmente funciones locales, funciones anónimas o expresiones Lambda.

Los cierres pueden acceder a variables fuera del cuerpo de la función, este proceso se denomina captura de variables. El código de ejemplo es el siguiente:

// 全局变量
var value = 10

fun main() {
    
    

    // 局部变量
    var localValue = 20

    var result = {
    
     a: Int ->
        value++
        localValue++
        val c = a + value + localValue
        println(c)
    }

    result(30) // 62
    println("localValue = " + localValue) // 21
    println("value = " + value) // 11
}

inserte la descripción de la imagen aquí

El cierre en este ejemplo es una expresión Lambda que captura el valor y las variables localValue. Capture el valor de las variables y localValue en el cuerpo de Lambda.

[Consejos para programadores de Java] En Java, cuando una expresión Lambda captura una variable local, la variable local solo puede ser final. En el cuerpo de Lambda, solo se pueden leer las variables locales, pero las variables locales no se pueden modificar. No existe tal restricción en Kotlin, y las variables locales se pueden leer y modificar .

[Nota] Después de que el cierre captura las variables, estas variables se almacenan en un contenedor especial. Incluso si el ámbito original en el que se declararon estas variables ya no existe, el cuerpo de cierre aún puede acceder a estas variables.

Aquí hay un ejemplo de una función local:

fun makeArray(): (Int) -> Int {
    
    
    var ary = 0

    // 局部函数捕获变量
    fun add(element: Int): Int {
    
    
        ary += element
        return ary
    }

    return ::add
}

fun main() {
    
    

    val f1 = makeArray()
    println("---f1---")

    println(f1(10))
    println(f1(20))
    println(f1(30))
}

inserte la descripción de la imagen aquí

El alcance de la variable ary es el cuerpo de la función makeArray En el cuerpo de la función local add, el valor de la variable ary se modifica y se devuelve.

De esta forma, al llamar en la función principal, f1 es una variable de la función local add, y cabe señalar que cada vez que se llama a f1, el alcance de la variable de ary ya no existe, por lo que la variable ary se puede mantener.

Esta castaña también se puede implementar con una función anónima, el código es el siguiente:

fun makeArray(): (Int) -> Int {
    
    
    var ary = 0

    // 局部函数捕获变量
    return fun(element: Int): Int {
    
    
        ary += element
        return ary
    }
}

fun main() {
    
    

    val f1 = makeArray()
    println("---f1---")

    println(f1(10))
    println(f1(20))
    println(f1(30))
}

inserte la descripción de la imagen aquí

La función makeArray devuelve una expresión Lambda, . Al comparar expresiones Lambda con funciones anónimas y funciones locales, encontrará que el código de las expresiones Lambda es el más conciso y el resultado final es exactamente el mismo.

Supongo que te gusta

Origin blog.csdn.net/weixin_44226181/article/details/130024492
Recomendado
Clasificación