kotlin的回調(diào)與java在寫法上略有不同颗品,直接上代碼
(為了好理解趾徽,我先按java寫法,不用Lambda)
1惨远、生成Person類及MyInterface 接口
class Person {
val name:String = "Person"
lateinit var mListen: MyInterface //接口可以延時(shí)加載
fun setListeren(listen: MyInterface){
this.mListen = listen
this.mListen?.poo(" poo :" +name)
}
interface MyInterface {
fun poo(str: String)
}
}
2谜悟、在Main或Activity中回調(diào)
fun main(args: Array<String>) {
println("Hello, world!")
var person = Person()
person.setListeren(object : Person.MyInterface {//object的作用是調(diào)用內(nèi)部匿名類
override fun poo(str:String) {
println(str)
}
})
}
3、打印結(jié)果
Hello, world!
poo :Person
以上是用原java寫法來(lái)實(shí)現(xiàn)kotlin回調(diào)的北秽,目的是從java轉(zhuǎn)來(lái)的人好理解
那么重點(diǎn)在下面
我們剛才只是用java的習(xí)慣來(lái)實(shí)現(xiàn)了kotlin語(yǔ)言的回調(diào)葡幸,那么拋開java習(xí)慣,用kotlin習(xí)慣應(yīng)該怎么寫呢贺氓?
先認(rèn)識(shí)一個(gè)概念
函數(shù) : 一個(gè)單方法的接口
再上代碼蔚叨,看看kotlin是如何簡(jiǎn)化java代碼的
class Person {
val name:String = "Person"
lateinit var mListen: (String) -> Unit // 聲明mListen是一個(gè)函數(shù)(單方法接口),入?yún)tring,無(wú)返回值
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) } // 只有一個(gè)參數(shù)的簡(jiǎn)化結(jié)果 it代表入?yún)?String類
}
打印結(jié)果
Hello, world!
invoke :Person
這就是kt語(yǔ)言蔑水!函數(shù)思維模式,不同于java扬蕊,慢慢習(xí)慣就好了