Kotlin 用好匿名函数,减少不必要的Interface

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里多个函数的还是规规矩矩的定义下一,毕竟这样方便其他人理解!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值