English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Expresión lambda de Kotlin

Expresión lambda

La expresión lambda o abreviada lambda es una función anónima; una función sin nombre. Estas funciones se pasan inmediatamente como expresiones sin necesidad de declarar. Por ejemplo:

fun main(args: Array<String>) {
    val greeting = { println("Hello!")}
    //Llamar a la función
    saludo()
}

Al ejecutar este programa, la salida será:

¡Hola!

Aquí, se asigna la expresión lambda a la variable greeting. Esta expresión no acepta ningún parámetro ni devuelve ningún valor en este programa.

Luego, llame a la función (expresión lambda) de la siguiente manera:

saludo()

Ejemplo: Lambda con parámetros y tipo de retorno

El siguiente programa tiene una expresión lambda que acepta dos enteros como parámetros y devuelve el producto de estos dos enteros.

fun main(args: Array<String>) {
    val product = { a: Int, b: Int -> a * b}
    val result = product(9, 3)
    println(result)
}

Al ejecutar este programa, la salida será:

27

Aquí, la expresión lambda es:

Tenga en cuenta que los corchetes curly contienen una expresión lambda.

Funciones de orden superior

Koltin ofrece un fuerte soporte para la programación funcional. Puede pasar una función como parámetro a otras funciones. Además, puede devolver una función desde otras funciones. Estas funciones se llaman funciones de orden superior.

Por conveniencia, generalmente se pasa la expresión lambda a una función de orden superior (en lugar de una función típica).

Ejemplo: pasar Lambda a una función

Vamos a pasar la expresión lambda a una función de orden superior. Este es su método de operación.

fun callMe(saludo: ()}} -> Unit) {
    saludo()
}
fun main(args: Array<String>) {
    callMe({ println("¡Hola!") })
}

Al ejecutar este programa, la salida será:

¡Hola!

Aquí, callMe() es una función de orden superior (porque toma una función como parámetro). El parámetro saludo acepta una lambda que se pasa a la función callMe():

 saludo: () -> Unit

Los corchetes vacíos indican que la función anónima no acepta parámetros. Y la palabra clave Unit indica que la función anónima no devuelve ningún valor.

La lambda se utiliza a menudo al manejar conjuntos. Y la biblioteca estándar tiene varias funciones integradas que se pueden usar con lambda para simplificar nuestra manera de completar tareas. Aquí se verán algunos ejemplos:

Ejemplo: función maxBy()

La función maxBy() devuelve el primer elemento que produce el valor máximo de la función dada; si no hay elementos, devuelve null.

data class Person(val nombre: String, val edad: Int)
fun main(args: Array<String>) {
    val personas = listOf(
            Person("Jack", 34),
            Person("Shelly", 19),
            Person("Patrick", 13),
            Person("Jill", 12),
            Person("Shane", 22),
            Person("Joe", 18)
            )
    val personaSeleccionada = personas.maxBy({ persona -> person.edad })
    println(selectedPerson)
    println("name: ${selectedPerson?.name}" )
    println("age: ${selectedPerson?.age}" )
}

Al ejecutar este programa, la salida será:

Person(name=Jack, edad=34)
nombre: "Jack"
age: 34

Aquí, la función maxBy() toma una lista de objetos Person y devuelve el objeto Person con la mayor edad.

palabra clave it: para un solo parámetro

En el programa anterior, la expresión lambda solo acepta un parámetro (lista de objetos Person). En este caso, se puede usar la palabra clave it para referirse al parámetro.

Puede

val personaSeleccionada = personas.maxBy({ persona -> person.edad })

equivalente a

val personaSeleccionada = personas.maxBy({ it.edad })

En el programa anterior.

Ejemplo: funciones maxBy() y startsWith()

El siguiente programa calcula la edad máxima del objeto Person que comienza con la letra S.

Vamos a usar las funciones de biblioteca maxBy() y startsWith() para completar esta tarea. Si la función startsWith() se pasa como argumento y comienza con el carácter especificado, devuelve true.

data class Person(val nombre: String, val edad: Int)
fun main(args: Array<String>) {
    val personas = listOf(
            Person("Jack", 34),
            Person("Shelly", 19),
            Person("Patrick", 13),
            Person("Jill", 12),
            Person("Shane", 22),
            Person("Joe", 18)
            )
    val selectedPerson = people
            .filter { it.name.startsWith("S") }
            .maxBy{ it.age }
    println(selectedPerson)
    println("name: ${selectedPerson?.name}" )
    println("age: ${selectedPerson?.age}" )
}

Al ejecutar este programa, la salida será:

Person(name=Shane, age=22)
name: Shane
age: 22