【问题标题】:I don't understand the argument passing of the lambda expression in the listener我不明白监听器中 lambda 表达式的参数传递
【发布时间】:2021-05-05 16:57:09
【问题描述】:

我开始学习 Kotlin 不久。

关于在 Android 侦听器中传递 lambda 表达式的部分我不理解。

在 JAVA 中

botton.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
                
     }
});

我理解这段代码。

我理解这段代码。一个匿名对象被创建并作为setOnClickListener的参数传递。

在 Kotlin 中

button.setOnClickListener(object: View.OnClickListener {
       override fun onClick(p0: View?) {
           TODO("Not yet implemented")
       }
})

我也理解这段代码。我理解它,因为它是一种创建类似于 Java 的匿名对象的方法。

但是

在 Kotlin 的拉姆达中

button?.setOnClickListener { }

我不明白这段代码是如何工作的。

此处表达的 lambda 应作为 setOnClickListener 的参数传递。

onClick()OnClickListener接口的实现函数,怎么可能传给setOnClickListener

我不太明白。

setOnClickListener 不是应该传递的OnClickListener 接口object 吗?

【问题讨论】:

  • 你看懂Java代码button.setOnClickListener(v -> {})吗?
  • 嗯,大致了解
  • 我认为您的 Kotlin 代码可以有效地做同样的事情。唯一的区别是您可以去掉括号,并且不必命名onClick 方法的单个参数。
  • 你应该看看这里的 lambda 文档:kotlinlang.org/docs/lambdas.html。尤其要注意 trailing lambdasit 部分。

标签: java android kotlin


【解决方案1】:

lambda 被作为参数传递给setOnClickListener

您可以通过尝试 button?.setOnClickListener({ }) 并注意到它仍然可以编译来测试它。

Android Studio 然后建议将其更改为 button?.setOnClickListener(){ },正如 Kotlin's coding convention 所指示的那样:

如果调用采用单个 lambda,请尽可能将其传递到括号外。

这给了我们button?.setOnClickListener(){ }

() 被标记为冗余,因为“使用 lambda 从函数调用中删除不必要的括号”导致...button?.setOnClickListener { }

注意:可以ctrl/cmd点击函数名,签名显示public void setOnClickListener(@Nullable OnClickListener l)

【讨论】:

  • button?.setOnClickListener({ }) 中,{ } 表示为 onClick() 的 lambda。而在 Kotlin 中,如果唯一的参数是 lambda 表达式,则可以通过减去 {} 来表达。最后() 可以省略。是这样吗?最终{ } 被传递给setOnClickListener,但是否有可能因为它是OnClickListener interface 的实现lambda?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
相关资源
最近更新 更多