java有接口回调,那么kotlin当然也有,而且比Java更简单,更高效!例如如下方法:
//添加inline的目的是可以节约内存,匿名函数不会创建对象
private inline fun method1(name: String, password: String, result: (String, Int) -> Unit) {
if (name == "haha" && password == "123456") {
result("sucess", 200)
} else {
result("fail", 300)
}
}
result: (String, Int) -> Unit这个参数就可以被认为是一个接口,这个是什么呢?它像不像一个未完成的匿名函数?所以匿名函数的作用就是体现在这里!这其实就是声明了传入类型无返回值的匿名函数。
如何调用?
写法一:这个比较特殊,参数可以写到外面(其实按照正常理解应该写到括号里),这是最常见的调用方式
method1("haha", "123456") { msg: String, code: Int ->
println("msg:$msg,code:$code")
}
写法二:这种写法是正确的,但是不推荐,代码优雅性差,但是写法一明显是由写法二优化来的,可以通过它去理解写法一
method1("haha", "123456", { msg: String, code: Int ->
println("msg:$msg,code:$code")
})
//写法三:比上面好点,但是也不是最推荐的写法
method1("haha", "123456", result = { msg: String, code: Int ->
println("msg:$msg,code:$code")
})
//写法四:函数引用,因为method1是inline的,所以性能是没有影响的,好处是抽离出来,别人也可以用
::result这样写才是函数对象,才可以被当作参数调用
fun main() {
method1("haha", "123456", ::result)
}
private fun result(msg: String, code: Int) {
println("msg:$msg,code:$code")
}
最后,写一个匿名函数的完整版,kotlin的接口回调就是基于这个匿名函数的
val result: (String, Int) -> Any = { msg, code ->
println("msg:$msg,code:$code")
}
result("sucess", 200)
}
网友评论