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吗?有关于内联的解释吗?