Lambdas de Kotlin

Expresiones lambda

La expresión lambda o simplemente lambda es una función anónima; una función sin nombre. Estas funciones se pasan inmediatamente como una expresión sin declaración. Por ejemplo,

 fun main(args: Array) ( val greeting = ( println("Hello!")) // invoking function greeting() )

Cuando ejecute el programa, la salida será:

 ¡Hola!

Aquí, se asigna una expresión lambda a la variable saludo. La expresión no acepta ningún parámetro y no devuelve ningún valor en este programa.

Luego, la función (expresión lambda) se invoca como:

 saludo() 

Ejemplo: Lambda con parámetros y tipo de retorno

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

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

Cuando ejecute el programa, la salida será:

 27

Aquí, la expresión lambda es:

Tenga en cuenta que una expresión lambda se incluye entre llaves.

Función de orden superior

Koltin tiene un gran soporte para la programación funcional. Puede pasar funciones como argumentos a otras funciones. Además, puede devolver una función de otras funciones. Estas funciones se denominan funciones de orden superior.

A menudo, las expresiones lambda se pasan a una función de orden superior (en lugar de una función típica) por conveniencia.

Ejemplo: pasar Lambda a la función

Pasemos una expresión lambda a una función de orden superior. Así es como puede hacerlo.

 fun callMe(greeting: () -> Unit) ( greeting() ) fun main(args: Array) ( callMe(( println("Hello!") )) )

Cuando ejecute el programa, la salida será:

 ¡Hola!

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

 saludo: () -> Unidad

El paréntesis vacío sugiere que la función anónima pasada no acepta ningún parámetro. Y la Unitpalabra clave sugiere que la función anónima no devuelve ningún valor.

Las lambdas se utilizan con frecuencia al trabajar con colecciones. Y hay varias funciones integradas disponibles en la biblioteca estándar que toman lambdas para facilitar nuestra tarea. Verá un par de ejemplos aquí:

Ejemplo: función maxBy ()

La función maxBy () devuelve el primer elemento que produce el valor más grande de la función dada o nullsi no hay elementos.

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

Cuando ejecute el programa, la salida será:

 Persona (nombre = Jack, edad = 34) nombre: Jack edad: 34

Aquí, la maxBy()función toma una lista de objetos Person y devuelve el objeto Person que tiene la edad máxima.

it Palabra clave: utilizado para un solo parámetro

En el programa anterior, la expresión lambda acepta solo un parámetro (una lista de objetos Person). En tales casos, puede hacer referencia al argumento mediante la palabra clave it.

Puedes reemplazar

 val selectedPerson = people.maxBy ((person -> person.age))

con

 val selectedPerson = people.maxBy ((it.age)) 

en el programa anterior.

Ejemplo: función maxBy () y startsWith ()

El siguiente programa calcula la edad máxima de un objeto Persona que comienza con la letra S.

Usaremos dos funciones de biblioteca maxBy()y startsWith()para realizar esta tarea. La función starsWith () regresa truesi comienza con el carácter especificado pasado como argumento.

 data class Person(val name: String, val age: Int) fun main(args: Array) ( val people = 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)" ) )

Cuando ejecute el programa, la salida será:

 Persona (nombre = Shane, edad = 22) nombre: Shane edad: 22

Lecturas recomendadas

  • Cierres Kotlin
  • Con Kotlin y aplica

Articulos interesantes...