Java Kotlin中高阶函数的奇异行为与SAM转换
这个问题与我先前的问题有关: 我编写了一个函数,将修改单击侦听器,如答案中所示:Java Kotlin中高阶函数的奇异行为与SAM转换,java,android,functional-programming,kotlin,higher-order-functions,Java,Android,Functional Programming,Kotlin,Higher Order Functions,这个问题与我先前的问题有关: 我编写了一个函数,将修改单击侦听器,如答案中所示: fun modifiedClick( onClick: (View) -> Unit): (View) -> Unit { return { //hide keyboard and invoke click only if there is a gap between frequent clicks hideKeyBoard(it)
fun modifiedClick( onClick: (View) -> Unit): (View) -> Unit {
return {
//hide keyboard and invoke click only if there is a gap between frequent clicks
hideKeyBoard(it)
if (!isClickDisabled) {
onClick(it)
}
}
}
现在如果我这样称呼它:
view.setOnClickListener {modifiedClick { login() }}
view.setOnClickListener (modifiedClick { login() })
inline fun modifiedClick(crossline onClick: (View) -> Unit): (View) -> Unit {
return {
//hide keyboard and invoke click only if there is a gap between frequent clicks
hideKeyBoard(it)
if (!isClickDisabled) {
onClick(it)
}
}
}
view.setOnClickListener {modifiedClick { login() }}
它不调用login()
但如果我将SAM转换为正常值,如下所示:
view.setOnClickListener {modifiedClick { login() }}
view.setOnClickListener (modifiedClick { login() })
inline fun modifiedClick(crossline onClick: (View) -> Unit): (View) -> Unit {
return {
//hide keyboard and invoke click only if there is a gap between frequent clicks
hideKeyBoard(it)
if (!isClickDisabled) {
onClick(it)
}
}
}
view.setOnClickListener {modifiedClick { login() }}
它起作用了
另外,如果我像下面这样内联函数:
view.setOnClickListener {modifiedClick { login() }}
view.setOnClickListener (modifiedClick { login() })
inline fun modifiedClick(crossline onClick: (View) -> Unit): (View) -> Unit {
return {
//hide keyboard and invoke click only if there is a gap between frequent clicks
hideKeyBoard(it)
if (!isClickDisabled) {
onClick(it)
}
}
}
view.setOnClickListener {modifiedClick { login() }}
然后像下面这样打电话:
view.setOnClickListener {modifiedClick { login() }}
view.setOnClickListener (modifiedClick { login() })
inline fun modifiedClick(crossline onClick: (View) -> Unit): (View) -> Unit {
return {
//hide keyboard and invoke click only if there is a gap between frequent clicks
hideKeyBoard(it)
if (!isClickDisabled) {
onClick(it)
}
}
}
view.setOnClickListener {modifiedClick { login() }}
它甚至没有调用modifiedClick
改成
view.setOnClickListener (modifiedClick { login() })
正在调用modifiedClick()
和login()
函数
有人能帮我弄明白发生了什么事吗
view.setOnClickListener {modifiedClick { login() }}
在这里,您为此编写了一个速记(我解释了类型/函数名):
它是一个侦听器,单击后调用modifiedClick
方法,该方法创建并返回修改后的侦听器。它返回的侦听器被简单地忽略,并且没有可观察的效果发生
与此相反,当你写
view.setOnClickListener(modifiedClick { login() })
您只需调用
modifiedClick{login()}
并将其返回值传递给setOnClickListener
——这正是您想要做的。真的不明白。如果只有一种方法,那么这有什么不同?我不是一个真正的函数式程序员。你能详细解释一下吗?你不需要是一个函数式程序员,你只需要知道lambda表达式是如何工作的——无论是在Kotlin还是在JavaI中,我都试图在更新的答案中使其更加明确。好的,那么,如果你用大括号指定,它会返回click listener吗?有关于内联的解释吗?