Podana funkcja foo:
fun foo(m: String, bar: (m: String) -> Unit) {
bar(m)
}
Możemy zrobić:
foo("a message", { println("this is a message: $it") } )
//or
foo("a message") { println("this is a message: $it") }
Teraz powiedzmy, że mamy następującą funkcję:
fun buz(m: String) {
println("another message: $m")
}
Czy istnieje sposób na przekazanie „buz” jako parametru do „foo”? Coś jak:
foo("a message", buz)
fun something() { foo("hi", { buz(it) }) }
this::function
bar: ((m: String) -> Unit)?
m
jest dla foo, drugi parametr to nazwa parametru typu funkcji przekazana w zmiennej bar do funkcji.O funkcji członkowskiej jako parametrze:
kod:
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) }) }
źródło
Po prostu użyj „::” przed nazwą metody
fun foo(function: () -> (Unit)) { function() } fun bar() { println("Hello World") }
foo(::bar)
Wyjście :Hello World
źródło
Kotlin 1.1
użyj
::
do metody referencyjnej.lubić
foo(::buz) // calling buz here fun buz() { println("i am called") }
źródło
Jeśli chcesz przekazać metody setter i getter .
private fun setData(setValue: (Int) -> Unit, getValue: () -> (Int)) { val oldValue = getValue() val newValue = oldValue * 2 setValue(newValue) }
Stosowanie:
private var width: Int = 1 setData({ width = it }, { width })
źródło
najwyraźniej nie jest to jeszcze obsługiwane.
więcej informacji:
http://devnet.jetbrains.com/message/5485180#5485180
http://youtrack.jetbrains.com/issue/KT-1183
źródło
Odpowiedź Jasona Minarda jest dobra. Można to również osiągnąć za pomocą pliku
lambda
.fun foo(m: String, bar: (m: String) -> Unit) { bar(m) } val buz = { m: String -> println("another message: $m") }
Które można zadzwonić
foo("a message", buz)
.Możesz również uczynić to nieco bardziej SUCHY, używając pliku
typealias
.typealias qux = (m: String) -> Unit fun foo(m: String, bar: qux) { bar(m) } val buz: qux = { m -> println("another message: $m") }
źródło
Inny przykład:
fun foo(x:Int, Multiply: (Int) -> (Int)) { println(Multiply(x)) } fun bar(x:Int):Int{ return x * x } foo(10, ::bar)
źródło
Możesz to również zrobić bezpośrednio przy użyciu lambdy, jeśli jest to jedyne miejsce, w którym używasz tej funkcji
fun foo(m: String, bar: (m: String) -> Unit) { bar(m) } foo("a message") { m: String -> println("another message: $m") } //Outputs: another message: a message
źródło
Funkcje pierwszej klasy nie są obecnie obsługiwane w Kotlinie. Odbyła się debata na temat tego, czy warto byłoby to dodać. Osobiście uważam, że powinni.
źródło