当前位置: 首页 > 知识库问答 >
问题:

使用lambda的Kotlin setOnClickListener语法

皮献
2023-03-14

在Kotlin中设置click侦听器时,我们可以这样写:

rollButton.setOnClickListener(
    object: View.OnClickListener {
        override fun onClick(v: View?) {
            rollDice();
        }
    }
)

SAM转换后,我们可以写:

rollButton.setOnClickListener({ v -> rollDice() })

但我注意到kotlin也接受:

rollButton.setOnClickListener(View.OnClickListener() { v -> rollDice() })

以及

rollButton.setOnClickListener(View.OnClickListener { v -> rollDice() })

我想知道这里发生了什么?我的意思是setonclicklistener应该使用匿名类或SAM速记之类的东西来实现onclicklistener。这是某种中间阶段还是什么?

任何解释或链接到资源是高度赞赏的。

共有1个答案

空翼
2023-03-14

对于这些示例,让接口为:

fun interface IntUser {
    fun use(value: Int)
}

SAM转换允许您使用接口的名称,就像使用lambda作为参数的构造函数一样。

val x = IntUser({ println(it) })

尾随lambda语法允许您将lambda移动到括号之外,如第二个示例所示:

val y = IntUser() { println(it) }

当lambda是唯一参数时使用拖尾lambda语法时,可以省略括号,如第三个示例所示:

val z = IntUser { println(it) }

最后,SAM转换可以做的另一件事是让您传递一个裸lambda来代替接口参数。它可以从函数参数推断出类型:

rollButton.setOnClickListener {
    rollDice()
}

这里我们使用lambda作为唯一的参数,因此我们还使用了尾随的lambda语法,并省略了空括号。

 类似资料:
  • 问题内容: 我正在用Yacc(与Go一起打包的一种语言)为一种玩具语言编写语法,由于以下伪问题,我预期会有移位-减少冲突。我必须将问题语法简化为以下内容。 Lambda函数如下所示: 我的解析器发出: 冲突:1班/减少 给定输入: 它会按规则正确解析一个。但是考虑到以下输入: (这将是身份函数的lambda,返回其输入)。我得到: 语法错误:意外的’{‘ 这是因为读取时,解析器选择将其简化为,而不

  • 问题内容: 我不太理解该参数背后的语法: 是不是随心所欲?为什么在看起来像是两次? 问题答案: 是一个函数,在比较它们之前将调用该函数来转换它们。传递给的参数必须是可调用的。 使用创建一个匿名函数(可调用)。在可调用的情况下仅采用一个参数。Python很简单。它只能做并真正返回一件事。 的语法是单词,后跟参数名称列表,然后是单个代码块。参数列表和代码块用冒号表示。这类似于在python其他构建体,

  • 我是kotlin的新手。我有一个带有2个重载方法的java类。一个接受一个函数,另一个接受两个 和 现在在kotlin中,我尝试使用两个参数调用版本(如java中): 但我得到编译错误。 Kotlin:意外标记(使用“;”在同一行上分隔表达式) 正确的语法是什么?

  • 本文向大家介绍Java中如何使用 lambda 表达式中的 return 语句,包括了Java中如何使用 lambda 表达式中的 return 语句的使用技巧和注意事项,需要的朋友参考一下 return语句不是lambda表达式中的表达式。我们必须用大括号({})括住语句。但是,我们不必将void方法调用括在大括号中。方法的返回类型,其中return语句中使用的lambda表达式必须是函数接口。

  • 问题内容: def sort_dictionary( wordDict ): sortedList = [] for entry in sorted(wordDict.iteritems(), key = lambda (k, v): (-v, k) ): sortedList.append( entry ) 该函数将接收包含诸如以下信息的字典:{‘this’:1,’is’:1,’a’:1,’la

  • 请解释Java8的lambda方法的语法。 关于lambda函数有很多解释,但我找不到关于语法的彻底解释,而且我发现很难学习正确地复制语法,因为我不明白为什么它们是按原样写的。 下面是我遇到的一个常见的例子,NetBeans: