我的Kotlin 学习之路(三)Kotlin之回调监听

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) {
    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) {
    println("Hello, world!") 
    var person = Person()
    person.setListeren{ println(it) }  // 只有一个参数的简化结果 it代表入参 String类 
}

打印结果
Hello, world!
invoke :Person

这就是kt语言!函数思维模式,不同于java,慢慢习惯就好了

你可能感兴趣的:(我的Kotlin 学习之路(三)Kotlin之回调监听)