我在 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))}}
最佳答案
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/