用kotlin有一段时间了,发现每次调用系统函数大部分都可以直接传递一个lambda表达式过去,而自己的函数却只能传一个引用过去,表示很无奈
然后就研究了下怎么自定义个一个可以接受lambda表达式的函数
网上搜了几篇文章感觉都比较绕,也可能是我比较笨,嗯,好了,长话短说
首先
假设我们需要在用户点击某个view的时候,可以拿到这个view的index
正常情况下,我们都是如下写法
class Container {
private var listener : ItemClickListener? = null
fun setOnItemClickListener(listener : ItemClickListener) {
this.listener = listener
}
}
fun test() {
val contaienr = Container()
contaienr.setOnItemClickListener(object : ItemClickListener {
override fun onItemClick(index : Int) {
Log.e(TAG , "$index")
}
})
}
interface ItemClickListener {
fun onItemClick(index : Int)
}
那么接下来就以一个简单易懂的例子教你写一个可以接受labmda表达式的函数
其他代码都没有变化,所以只展示有变化的部分
如下:
class Container {
private var listener : ItemClickListener? = null
fun setOnItemClickListener(listener : ItemClickListener) {
this.listener = listener
}
fun setOnItemClickListener(action : (Int) -> Unit) {
listener = object : ItemClickListener {
override fun onItemClick(index : Int) {
action(index)
}
}
}
}
fun test() {
val contaienr = Container()
contaienr.setOnItemClickListener(object : ItemClickListener {
override fun onItemClick(index : Int) {
Log.e(TAG , "$index")
}
})
contaienr.setOnItemClickListener { Log.e(TAG , "$it") }
}
上面的action就是你传进来的lambda表达式,他表示接收一个Int类型的参数,没有返回值
这样是不是写个又返回值的或者多个参数的都手到擒来,怎么样,学会了吗,是不是简单易懂