kotlin学习之自定义lambda表达式----简单易懂教你写一个可以接受lambda表达式的函数

时间:2022-07-17 19:07:15

用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类型的参数,没有返回值


这样是不是写个又返回值的或者多个参数的都手到擒来,怎么样,学会了吗,是不是简单易懂