我不明白 lambda 表达式在侦听器中的参数传递



我刚开始学习科特林不久。

关于Android监听器中lambda表达式的传递,有些部分我不理解。

在JAVA中

botton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

}
});

我理解这个代码。

我理解这个代码。创建一个匿名对象并将其作为setOnClickListener的参数传递。

在Kotlin

button.setOnClickListener(object: View.OnClickListener {
override fun onClick(p0: View?) {
TODO("Not yet implemented")
}
})

我也理解这个代码。我理解它,因为它是一种创建类似Java的匿名对象的方法。

但是

在Kotlin的Lamda

button?.setOnClickListener { }

我不明白这个代码是如何工作的。

此处表达的lambda应作为setOnClickListener的参数传递。

onClick()OnClickListener接口的实现函数,怎么可能传递给setOnClickListener

我不太明白。

setOnClickListener不是应该传递的OnClickListener接口object吗?

lambda IS作为参数传递给setOnClickListener

您可以通过尝试button?.setOnClickListener({ })并注意到它仍在编译来测试这一点。

安卓工作室随后建议将其更改为button?.setOnClickListener(){ },正如Kotlin的编码惯例所规定的那样:

如果一个调用使用一个lambda,请尽可能将其传递到括号之外。

这给了我们button?.setOnClickListener(){ }

()被标记为冗余从lambda函数调用中删除不必要的括号";导致…button?.setOnClickListener { }

注意:您可以ctrl/cmd单击函数名称,签名显示public void setOnClickListener(@Nullable OnClickListener l)

最新更新