在一个android程序中,我有以下代码:
clockCheckBox.setOnClickListener((object: View.OnClickListener {
override fun onClick(view: View): Unit {
if (clockCheckBox.isChecked())
enableClocks()
else
disableClocks()
}
}))
在 Android Studio 中,会出现一个工具提示,上面写着:
This inspection reports an anonymous object literal implementing a java interface with single abstract method that can be converted into call with lambda expression.
我试过这样做,但我得到的只是语法错误。你能告诉我正确的语法吗?我或许应该解释一下,这段代码在我的 Activity 的 onCreate
方法中,而 clockCheckBox 是一个定义为
val clockCheckBox = findViewById(R.id.clockCheckBox) as CheckBox
最佳答案
在了解 Kotlin 约定的同时,仔细查看检查报告很有用。
This inspection reports an anonymous object literal implementing a java interface with single abstract method (emphasis mine) that can be converted into call with lambda expression.
这份报告的重点之一是“用一个抽象方法实现一个java接口(interface)”。这是关键,因为实现这些类型接口(interface)的匿名对象可以简洁地编写为 lambda。换句话说,您可以跳过匿名对象字面量和接口(interface)名称,只使用符合单个抽象方法签名的 lambda。
在 onClick 的情况下,等效的签名是
(view: View) -> Unit
所以你的例子的 lambda 是
{ view -> if (clockCheckBox.isChecked) enableClocks() else disableClocks() }
但由于您没有在 lambda 主体中使用“view”,因此可以省略“view ->”。您使用的不是 View ,而是 clockCheckBox(这是 lambda 闭包中的 View )。
最后,当函数调用的最后一个参数是 lambda 时,而不是写
myFun( { ... } )
你可以改写
myFun { ... }
换句话说,您将最后一个参数 lambda 移到圆括号外(如果只有一个参数,圆括号可以省略)。因此,您使用 lambda 的完整示例将是
clockCheckBox.setOnClickListener {
if(clockCheckBox.isChecked()) enableClocks() else disableClocks()
}
关于android - 将函数调用转换为 Lambda (SAM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45199217/