Kotlin: ¿cómo pasar una función como parámetro a otra?
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)
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)
Acerca de la función miembro como parámetro:
- 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)
- Por lo tanto, la función miembro no se puede utilizar del mismo modo que la función de primera clase.
- 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) })
}
Simplemente use "::" antes del nombre del método
fun foo(function: () -> (Unit)) {
function()
}
fun bar() {
println("Hello World")
}
foo(::bar)
Producción :Hello World
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 })