在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
。这是某种中间阶段还是什么?
任何解释或链接到资源是高度赞赏的。
对于这些示例,让接口为:
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: