Según la documentación oficial de Kotlin, “un cierre es un tipo especial de objeto que combina dos cosas: una función y el entorno en el que se creó esa función. El entorno consta de cualquier variable local que estuviera dentro del alcance en el momento en que se creó el cierre”
var sum = 0 ints.filter { it > 0 }.forEach { sum += it } print(sum)
- Los cierres en programación funcional son las funciones que son conscientes de su entorno. Con esto quiero decir que una función de cierre tiene acceso a las variables y parámetros definidos en el ámbito externo.
- Recuerde que en Java y en la programación procesal tradicional, las variables estaban vinculadas al alcance y, tan pronto como se ejecutaba el bloque, las propiedades locales desaparecían de la memoria.
- Las lambdas de Java 8 pueden acceder a variables externas, pero no pueden modificarlas, y esto limita las capacidades si intenta hacer programación funcional en Java 8.
- Echemos un vistazo a un ejemplo en el que trabajamos con cierres en Kotlin.
Ejemplo
En este ejemplo, simplemente crearemos una array de enteros y calcularemos su suma:
Kotlin
fun main (args: Array<String>) { sum=0 var listOfInteger= arrayOf (0, 1, 2, 3, 4, 5, 6, 7) listOfInteger.forEach { sum+=it println (sum) } }
Producción:
28
En el ejemplo anterior, la variable de suma se define en el ámbito externo; aún así, podemos acceder y modificarlo.
Los cierres también pueden mutar las variables que han cerrado.
Kotlin
var containsNegative = false val ints = listOf(0, 1, 2, 3, 4, 5) ints.forEach { if (it < 0) containsNegative = true }
Muy simple, este código se cierra sobre una variable local, containsNegative , estableciéndola como verdadera si se encuentra un valor negativo en una lista. En el mundo real, usaría una función integrada para esto en lugar de esta función, pero indica cómo se pueden actualizar vars desde dentro de un literal de función.
¿Cómo crear un cierre en Kotlin que tome cualquier tipo de parámetro y devuelva cualquier tipo de variable como valor de retorno?
El problema es con test: Int of foo:
val foo = { test: Int -> "Just Testing $test" }
foo requiere prueba para ser un Int. Si llama a foo con un parámetro de tipo Any? podría ser nulo o un tipo como String. Pero eso no funcionaría. Así que si lo declaras comouna prueba: alguna? su código se compilaría.
Publicación traducida automáticamente
Artículo escrito por eralokyadav2019 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA