android - 将函数调用转换为 Lambda (SAM)

标签 android kotlin

在一个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/

相关文章:

android - Cordova CLI android 路径错误

java - 在 Eclipse 中,我可以使用什么来封装可以切换查看或不查看的代码块?

java - REST Web服务不接收Android HttpPost参数

android - 无法在 android 中解析符号 'Defaulthttpclient' 和 'Httppost'

android - 如何以及在何处声明用于保存数据的全局变量

java - 按特定顺序添加 View 并存储该顺序

java - Kotlin 委托(delegate)表达而不是固定引用

multithreading - 使用多线程协程有什么好处?

kotlin - 使用 hashmap 键的 Smart Cast

android - 将数据从一项 Activity 发送回另一项 ANDROID KOTLIN