gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:39 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com