android - Kotlin 中的 SAM 转换(Lambda 表达式)

标签 android kotlin lambda

我在 Java 中定义了以下功能接口(interface)。

interface OnButtonSwitchedListener {
    fun onButtonSwitched(isLogin: Boolean)
}

现在,问题是当我必须在 Kotlin 中使用它时,我必须创建一个匿名对象来使用这个接口(interface),就像这样,
binding.button.setOnButtonSwitched(object: OnButtonSwitchedListener{
                    override fun onButtonSwitched(isLogin: Boolean) {
                        binding.root
                            .setBackgroundColor(
                                ContextCompat.getColor(
                                    this@AuthActivity,
                                     if(isLogin) R.color.colorPrimary else R.color.lb_secondPage))
                    }
                })

但是,语法是Java8要聪明很多,
binding.button.setOnButtonSwitched(isLogin -> {
                binding.root
                    .setBackgroundColor(
                        ContextCompat.getColor(
                        this,
                        isLogin ? R.color.colorPrimary : R.color.secondPage));
            })

有什么办法,我也可以在 Kotlin 中编写类似的 lambda 表达式吗?

我尝试了以下操作,但它引发了插图中显示的错误。
setOnButtonSwitched{isLogin -> {binding.root
                    .setBackgroundColor(
                        ContextCompat.getColor(
                            this@AuthActivity,
                            if(isLogin) R.color.colorPrimary else R.color.lb_secondPage))}}

Error message in Android Studio

最佳答案

SAM Conversions are going to be introduced in Kotlin 1.4 ,在此之前,您现在必须手动实现接口(interface)并覆盖该功能。

它们看起来与普通的 lambda 相同:

binding.button.setOnButtonSwitched{ isLogin ->
    ...
}

PS:Kotlin 1.4 的预计发布时间为 2020 年 Spring

对于当前版本 Kotlin 1.3.xx

如果你经常使用这些,那么现在尝试创建一个实用函数:

fun OnButtonSwitchedListener(block: (Boolean) -> Unit) =
    object : OnButtonSwitchedListener {
        override fun onButtonSwitched(isLogin: Boolean) {
            block(isLogin)
        }
    }

现在你可以这样调用:

binding.button.setOnButtonSwitched(OnButtonSwitchedListener { isLogin ->
   ... // your code
})

关于android - Kotlin 中的 SAM 转换(Lambda 表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61189373/

相关文章:

c# - 无法捕获 Invoke 在已编译表达式上抛出的异常

android - Gallery setSelection 不会触发图像选择器

java - 向适配器添加新项目时 ArrayAdapter 崩溃

java - 如何从 LibGDX And​​roid 类启动 kotlin Activity

android - 如何使用 Jetpack Compose 在 TopAppBar 中设置渐变背景

java - 像分组列表一样的 SQL 连接

android - 设置以编程方式创建的按钮的文本

java - 有什么方法可以重构这段代码或以紧凑的形式重写它吗?

正则表达式在 Kotlin 中不匹配

c# - 如何在 LINQ 语句中重用表达式?