¿Cómo pasar una función como parámetro a otra en Kotlin?

Kotlin nos da el poder de declarar funciones de alto orden. En una función de orden superior, podemos pasar y devolver funciones como parámetros. Esta es una característica extremadamente útil y hace que nuestro código sea mucho más fácil de trabajar. De hecho, muchas de las funciones de la biblioteca de Kotlin son de alto nivel, como NBQ. En Kotlin, podemos declarar funciones y referencias a funciones como valores que luego se pasan a la función. Primero entenderemos cómo declarar lambdas y luego cómo pasarlas a una función.

Ejemplo

Comencemos por entender cómo declaramos funciones como lambdas:

Kotlin

fun main (args: Array<String>) {
  val funcMultiply - {a: Int, b: Int -> a*b}
  println (funcMultiply (4, 3))
  val funcSayHi - {name: String -> println ("Hi $name") }
  funcSayHi("John")
}

En el bloque de código anterior, declaramos dos lambdas: una (funcMultiply) que toma dos números enteros y devuelve un número entero, y otra lambda (funcSayHi) que toma una string y devuelve una unidad, es decir, no devuelve nada. Aunque no necesitamos declarar el tipo de argumentos y el tipo de devolución en el ejemplo anterior, en algunos casos necesitamos declarar explícitamente los tipos de argumento y los tipos de devolución. Hacemos esto de la siguiente manera:

Kotlin

fun main (args: Array<String>) {
  val funcMultiply : (Int, Int)->Int = {a: Int, b:Int -> a*b}
  println (funcMultiply (4, 3))
  val funcSayHi : (String) ->Unit = {name: String -> println("Hi $name")}
  funcSayHi ("John")
}

Entonces, ahora que tenemos una idea general de cómo funcionan las lambdas, intentemos pasar una en otra función, es decir, probaremos una función de orden superior. Echa un vistazo a este fragmento de código:

Kotlin

fun main (args: Array<String>) { 
  val funcMultiply : (Int, Int) ->Int = {a: Int, b:Int -> a*b}
  val funcSum : (Int, Int) ->Int = {a: Int, b: Int -> a+b}
  performMath (3, 4, funcMultiply)
  performMath (3, 4, funcSum)
}
  
fun performMath (a: Int, b:Int, mathFunc : (Int, Int) -> Int) : Unit
{
  println ("Value of calculation: ${mathFunc (a, b) }")
}

Es tan simple como eso: cree una función lambda y pásela a la función. Entonces, este es solo un aspecto de una función de orden superior, es decir, podemos pasar una función como argumento a la función. Otro uso de las funciones de alto orden es devolver una función. Considere el siguiente ejemplo donde necesitamos una función que transforme el precio total de una orden de acuerdo a ciertas condiciones. Algo así como un sitio de comercio electrónico, pero mucho más simple

Kotlin

fun main(args: Array<String>) {
  // free delivery of order above 499
  val productPricel = 600; 
  // not eligible for free deliver
  val productPrice2 = 300; 
  val totalCost1 = totalCost (productPrice1)
  val totalCost2 = totalCost (productPrice2)
    
  println("Total cost for item 1 is ${totalCost1 (productPrice1) }")
  println ("Total cost for item 2 is ${totalCost2 (productPrice2) }")
}
  
fun totalCost (productCost : Int) : (Int) -> Int(
  if (productCost > 499) {
    return { x -> x }
  }
  else {
    return { x -> x + 50 }
  }
}

Tenga en cuenta cómo necesitamos cambiar las funciones que aplicamos en función de ciertas condiciones para que devolvamos una función que se adapte a las condiciones. Asignamos la función devuelta a una variable y luego simplemente podemos poner append() delante de la variable para usarla como una función, tal como lo hicimos con las lambdas. Esto funciona porque la función de orden superior esencialmente devuelve una lambda.

En Kotlin, podemos asignar una función a una variable y luego podemos pasarla a una función o devolverla desde una función. Esto se debe a que esencialmente se declara como una variable. Esto se hace usando una declaración lambda de funciones.

Publicación traducida automáticamente

Artículo escrito por eralokyadav2019 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 *