给定函数foo:
fun foo(m: String, bar: (m: String) -> Unit) {
bar(m)
}
我们可以:
foo("a message", { println("this is a message: $it") } )
//or
foo("a message") { println("this is a message: $it") }
现在,假设我们有以下函数:
fun buz(m: String) {
println("another message: $m")
}
是否有一种方法,我可以通过“buz”作为参数“foo”?
喜欢的东西:
foo("a message", buz)
Jason Minard的回答很好。这也可以使用lambda来实现。
fun foo(m: String, bar: (m: String) -> Unit) {
bar(m)
}
val buz = { m: String ->
println("another message: $m")
}
可以用foo("a message", buz)调用。
您还可以使用类型别名使其更加DRY。
typealias qux = (m: String) -> Unit
fun foo(m: String, bar: qux) {
bar(m)
}
val buz: qux = { m ->
println("another message: $m")
}
关于作为形参的成员函数:
Kotlin类不支持静态成员函数,因此不能像这样调用成员函数:
接线员::添加(5,4)
因此,成员函数不能像头等函数那样使用。
一个有用的方法是用lambda来包装函数。它并不优雅,但至少在工作。
代码:
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) })
}
使用::表示函数引用,然后:
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)
}
从Kotlin 1.1开始,你现在可以使用作为类成员的函数(“绑定可调用引用”),方法是在函数引用操作符前加上实例:
foo("hi", OtherClass()::buz)
foo("hi", thatOtherThing::buz)
foo("hi", this::buz)