Kotlin: ¿cómo pasar una función como parámetro a otra?

Resuelto mhshams asked hace 11 años • 11 respuestas

Función dada foo:

fun foo(m: String, bar: (m: String) -> Unit) {
    bar(m)
}

Podemos hacer:

foo("a message", { println("this is a message: $it") } )
//or 
foo("a message")  { println("this is a message: $it") }

Ahora digamos que tenemos la siguiente función:

fun buz(m: String) {
   println("another message: $m")
}

¿Hay alguna manera de pasar "buz" como parámetro a "foo"? Algo como:

foo("a message", buz)
mhshams avatar Apr 20 '13 20:04 mhshams
Aceptado

Úselo ::para indicar una referencia de función y luego:

fun foo(msg: String, bar: (input: String) -> Unit) {
    bar(msg)
}

// my function to pass into the other
fun buz(input: String) {
    println("another message: $input")
}

// someone passing buz into foo
fun something() {
    foo("hi", ::buz)
}

Desde Kotlin 1.1, ahora puedes usar funciones que son miembros de clase (" Referencias invocables vinculadas "), anteponiendo al operador de referencia de función la instancia:

foo("hi", OtherClass()::buz)

foo("hi", thatOtherThing::buz)

foo("hi", this::buz)
Jayson Minard avatar Oct 28 '2015 22:10 Jayson Minard

Acerca de la función miembro como parámetro:

  1. La clase Kotlin no admite funciones miembro estáticas, por lo que la función miembro no se puede invocar como: Operador::add(5, 4)
  2. Por lo tanto, la función miembro no se puede utilizar del mismo modo que la función de primera clase.
  3. Un enfoque útil es envolver la función con una lambda. No es elegante pero al menos funciona.

código:

class Operator {
    fun add(a: Int, b: Int) = a + b
    fun inc(a: Int) = a + 1
}

fun calc(a: Int, b: Int, opr: (Int, Int) -> Int) = opr(a, b)
fun calc(a: Int, opr: (Int) -> Int) = opr(a)

fun main(args: Array<String>) {
    calc(1, 2, { a, b -> Operator().add(a, b) })
    calc(1, { Operator().inc(it) })
}
Rui Zhou avatar May 28 '2016 04:05 Rui Zhou

Simplemente use "::" antes del nombre del método

fun foo(function: () -> (Unit)) {
   function()
}

fun bar() {
    println("Hello World")
}

foo(::bar) Producción :Hello World

erluxman avatar May 23 '2017 10:05 erluxman

Kotlin 1.1

utilizar ::para hacer referencia al método.

como

    foo(::buz) // calling buz here

    fun buz() {
        println("i am called")
    }

Si desea pasar los métodos setter y getter .

private fun setData(setValue: (Int) -> Unit, getValue: () -> (Int)) {
    val oldValue = getValue()
    val newValue = oldValue * 2
    setValue(newValue)
}

Uso:

private var width: Int = 1

setData({ width = it }, { width })
CoolMind avatar Mar 19 '2019 07:03 CoolMind