kotlin的回调与java在写法上略有不同,直接上代码
(为了好理解,我先按java写法,不用Lambda)
1、生成Person类及MyInterface 接口
class Person {
val name:String = "Person"
lateinit var mListen: MyInterface //接口可以延时加载
fun setListeren(listen: MyInterface){
this.mListen = listen
this.mListen?.poo(" poo :" +name)
}
interface MyInterface {
fun poo(str: String)
}
}
2、在Main或Activity中回调
fun main(args: Array<String>) {
println("Hello, world!")
var person = Person()
person.setListeren(object : Person.MyInterface {//object的作用是调用内部匿名类
override fun poo(str:String) {
println(str)
}
})
}
3、打印结果
Hello, world!
poo :Person
以上是用原java写法来实现kotlin回调的,目的是从java转来的人好理解
那么重点在下面
我们刚才只是用java的习惯来实现了kotlin语言的回调,那么抛开java习惯,用kotlin习惯应该怎么写呢?
先认识一个概念
函数 : 一个单方法的接口
再上代码,看看kotlin是如何简化java代码的
class Person {
val name:String = "Person"
lateinit var mListen: (String) -> Unit // 声明mListen是一个函数(单方法接口),入参String,无返回值
fun setListeren(listener: (String) -> Unit){
this.mListen = listener
this.mListen("invoke :" +name) //等于 mListen?.invoke("invoke :" +name) X()等同于X.invoke()
}
//不再需要声明接口类!
}
fun main(args: Array<String>) {
println("Hello, world!")
var person = Person()
person.setListeren{ println(it) } // 只有一个参数的简化结果 it代表入参 String类
}
打印结果
Hello, world!
invoke :Person
这就是kt语言!函数思维模式,不同于java,慢慢习惯就好了
网友评论
还有一个是person.setListeren()请问小括号的这种方式怎么去实现啊?