Funciones de orden superior de Kotlin

El lenguaje Kotlin tiene un excelente soporte para la programación funcional. Las funciones de Kotlin pueden almacenarse en variables y estructuras de datos, pasarse como argumentos y devolverse desde otras funciones de orden superior. 

Función de orden superior –

En Kotlin, una función que puede aceptar una función como parámetro o puede devolver una función se llama función de orden superior . En lugar de Integer, String o Array como parámetro para funcionar, pasaremos una función anónima o lambdas. Con frecuencia, las lambdas se pasan como parámetro en las funciones de Kotlin por conveniencia. 

Pasar la expresión lambda como parámetro a la función de orden superior:

Podemos pasar una expresión lambda como parámetro a la función de orden superior. 
Hay dos tipos de expresiones lambda que se pueden pasar: 

  • Expresión lambda que devuelve Unidad
  • Expresión lambda que devuelve cualquiera de los valores enteros, strings, etc.

Programa Kotlin de expresión lambda que devuelve Unit-  

Kotlin

      // lambda expression
var lambda = {println("GeeksforGeeks: A Computer Science portal for Geeks") }
      // higher-order function
fun higherfunc( lmbd: () -> Unit ) {     // accepting lambda as parameter
    lmbd()                               //invokes lambda expression
}
fun main(args: Array<String>) {
     //invoke higher-order function
    higherfunc(lambda)                 // passing lambda as parameter
}

Producción: 

GeeksforGeeks: A Computer Science portal for Geeks

Explicación: 
comprendamos el programa anterior paso a paso:
en la parte superior, definimos una expresión lambda que contiene print() para imprimir una string en la salida estándar. 

var lambda = {println("GeeksforGeeks: A Computer Science portal for Geeks") } 

luego, definimos una función de orden superior que contiene un parámetro. 

lmbd: () -> Unit

lmbd es el nombre local del parámetro lambda de recepción. 
() representa que la función no acepta ningún argumento. 
La unidad representa que la función no devuelve ningún valor.
En la función principal, hemos invocado la función de orden superior pasando la expresión lambda como parámetro. 

higherfunc(lambda)

Programa Kotlin de expresión lambda que devuelve un valor entero –  

Kotlin

    // lambda expression
var lambda = {a: Int , b: Int -> a + b }
    // higher order function
fun higherfunc( lmbd: (Int, Int) -> Int) {      // accepting lambda as parameter
         
    var result = lmbd(2,4)    // invokes the lambda expression by passing parameters                   
    println("The sum of two numbers is: $result")
}
 
fun main(args: Array<String>) {
    higherfunc(lambda)           //passing lambda as parameter
}

Producción: 

The sum of two numbers is: 6

Explicación: 
comprendamos el programa anterior paso a paso:
en la parte superior, definimos una expresión lambda definida que devuelve un valor entero. 

var lambda = {a: Int , b: Int -> a + b }

Luego, hemos definido una función de orden superior que acepta la expresión lambda como parámetro.  

lmbd: (Int, Int) -> Int

lmbd es el nombre local del parámetro lambda de recepción. 
(Int,Int) representa que la función acepta dos parámetros de tipo entero. 
-> Int representa que la función devuelve un valor entero.
En la función principal, hemos invocado la función de orden superior pasando la lambda como parámetro. 

higherfunc(lambda)

Pasando la función como un parámetro a la función de orden superior –

Podemos pasar una función como parámetro en la función de orden superior. 
Hay dos tipos de funciones que se pueden pasar: 

  • función que devuelve Unidad
  • función que devuelve cualquiera de los valores enteros, strings, etc.

Programa Kotlin de función de paso que devuelve Unit-  

Kotlin

    // regular function definition
fun printMe(s:String): Unit{
    println(s)
}
   // higher-order function definition
fun higherfunc( str : String, myfunc: (String) -> Unit){
   // invoke regular function using local name
    myfunc(str)
}
fun main(args: Array<String>) {
    // invoke higher-order function
    higherfunc("GeeksforGeeks: A Computer Science portal for Geeks",::printMe)
}

Producción: 

GeeksforGeeks: A Computer Science portal for Geeks

Explicación: 
En la parte superior, definimos una función normal printMe() que acepta un parámetro de tipo String y devuelve Unidad. 

fun printMe(s:String): Unit

(s: String) es el único parámetro 
La unidad representa el tipo de retorno
Luego, definimos la función de orden superior como 

fun higherfunc( str : String, myfunc: (String) -> Unit)

recibe dos parámetros, uno es de tipo String y otro es de función 
str: String representa el parámetro de string 
myfunc: (String) -> Unit representa que acepta la función como un parámetro que devuelve Unit.
Desde la función principal, se invoca la función superior pasando la string y la función como argumentos. 

 higherfunc("GeeksforGeeks: A Computer Science portal for Geeks",::printMe)

Programa Kotlin de función de paso que devuelve un valor entero- 

Kotlin

    // regular function definition
fun add(a: Int, b: Int): Int{
    var sum = a + b
    return sum
}
    // higher-order function definition
fun higherfunc(addfunc:(Int,Int)-> Int){
    // invoke regular function using local name
    var result = addfunc(3,6)
    print("The sum of two numbers is: $result")
}
fun main(args: Array<String>) {
    // invoke higher-order function
    higherfunc(::add)
}

Producción: 

The sum of two numbers is: 9

Explicación: 
En la parte superior, definimos la función regular como 

fun add(a: Int, b: Int): Int{
    var sum = a + b
    return sum
}

acepta dos parámetros de tipo Integer y devuelve la suma de ambos enteros
Luego, definimos la función de orden superior como 

fun higherfunc(addfunc:(Int,Int)-> Int)

acepta una función que contiene dos parámetros y 
llama a la función normal addfunc(3,6) pasando los parámetros.
Desde la función principal, invocamos la función de orden superior pasando la función regular como parámetro 

higherfunc(::add)

Devolver una función desde una función de orden superior

Podemos devolver una función de una función de orden superior. Al devolver la función, tenemos que especificar los tipos de parámetros y el tipo de retorno de la función regular en el tipo de retorno de la función de orden superior. 

Programa Kotlin de una función que devuelve otra función.  

Kotlin

      // function declaration
fun mul(a: Int, b: Int): Int{
    return a*b
}
    //higher-order function declaration
fun higherfunc() : ((Int,Int)-> Int){
    return ::mul
}
fun main(args: Array<String>) {
     // invoke function and store the returned function into a variable
    val multiply = higherfunc() 
    // invokes the mul() function by passing arguments
    val result = multiply(2,4)  
    println("The multiplication of two numbers is: $result")
}

Producción: 

The multiplication of two numbers is: 8

Explicación: 
En la parte superior del programa definimos la función mul() que acepta dos parámetros y su tipo de devolución también es un número entero. 

fun mul(a: Int, b: Int): Int

Luego, definimos que la función de orden superior que tiene un tipo de retorno es una función. 

fun higherfunc5() : ((Int,Int)-> Int){
    return ::mul
}

::mul representa que devuelve la función mul() 
(Int,Int) representa que mul acepta dos parámetros de tipo entero 
Int representa que mul devuelve un valor entero.
En la función principal, hemos llamado a la función superior que devuelve otra función y la almacena en una variable multiplicada. 

val multiply = higherfunc()

luego invocamos la función mul() usando la variable local multiplicar(2,4) pasando dos argumentos.
 

Publicación traducida automáticamente

Artículo escrito por shad0w1947 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *