Java lamda从java8版本开始流行,大大简化了interface作为参数传递的写法,接触到便深深爱上他了,这是前言!
Kotlin作为语法糖版的Java,很大程度上简化了java某些不必要的语法,从而使得很大程度上kotlin的开发速度会比java开发速度快。
Kotlin调用java的方法,如果需要传interface作为参数的话,一般kotlin会让你使用kotlin转换的lamda语法,比如Android给button添加点击事件:
button.setOnClickListener{
}
不过kotlin自定义的interface却无法使用lamda传参!!emm…这就很尴尬
但是kotlin给出另一种大宝贝:
匿名函数
通过匿名函数,我们可以实现lamda,从而减少不必要的interface。
举个例子:
你有一个一直读取数据的线程A类,还有一个处理数据的线程B类,B类实例化了A类,这时B类需要获取A类读取的数据,但是A类是个异步读取数据的类,这是你会先想到用interface来获取数据,于是你这么定义:
interface Ia{
fun readData(bytes:ByteArray)
}
class A(ia:Ia):Thread(){
override fun run(){
while(true){
val bytes=ByteArray(1024)
input.read(bytes)//某个读取数据流的inputstream
ia.readData(bytes)
}
}
}
class B:Ia{
init{
A(object:Ia{
override fun readData(bytes:ByteArray){
//处理数据
}
})
}
}
这样看上去还可以,有2个class跟1个接口,你觉得还不错,但是跟java代码量差不多。
接下来请看如果使用Lamda
class A(val readData:(bytes:ByteArray)->Unit):Thread(){
override fun run(){
while(true){
val bytes=ByteArray(1024)
input.read(bytes)//某个读取数据流的inputstream
readData(bytes)
}
}
}
class B:Ia{
init{
A({
//处理数据
})
}
//上面是为了给初学者看的,下面是给有基础的童鞋看的
init{
A{
//处理数据
}
}
}
除了逻辑部分没改变,interface接口已经被完成省略了。
解释一下其他的:
val readData:(bytes:ByteArray)->Unit
Unit是返回类型,Unit就相当于void
就是不需要返回值,但是定义lamda必须要给,
所以无返回值也就是void,就直接写Unit,
如果需要返回Int、String等等就改成对应的就行
好了,这就是lamda,lamda省略了一些临时需要的interface接口,但是一些常用的接口,一个interface里多个函数的还是规规矩矩的定义下一,毕竟这样方便其他人理解!