解释这个Kotlin函数结构

时间:2017-04-23 17:15:35

标签: android function kotlin explain

我正在使用这个Kotlin功能。我知道我们有一个名为mPasswordView!!.setOnEditorActionListener的函数,它接受参数TextView.OnEditorActionListener,但之后是什么?我们在参数里面有花括号吗?

mPasswordView!!.setOnEditorActionListener(TextView.OnEditorActionListener { textView, id, keyEvent ->
    if (id == R.id.login || id == EditorInfo.IME_NULL) {
        attemptLogin()
        return@OnEditorActionListener true
    }
    false
})

2 个答案:

答案 0 :(得分:6)

您的示例中使用的功能是SAM constructorsetOnEditorActionListener侦听器将OnEditorActionListener作为参数。此接口只有一个必须实现的方法,这使其成为单一抽象方法(SAM)接口。

在Java中使用此方法的完整语法是:

mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        attemptLogin();
        return true;
    }
});

与Kotlin的一对一转换会给你:

mPasswordView.setOnEditorActionListener(object: TextView.OnEditorActionListener{
    override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean {
        attemptLogin()
        return true
    }
})
但是,Kotlin允许您通过传入lambda来使用以SAM接口作为参数的方法,并使用更简洁的语法。这称为SAM转换:

mPasswordView.setOnEditorActionListener { v, actionId, event ->
    attemptLogin()
    true
}

SAM转换会自动确定此lambda对应的接口,但您可以使用称为SAM构造函数的内容明确指定它,这就是示例代码中的内容。 SAM构造函数返回一个实现给定接口的对象,并使您已经将lambda传递给它的单个方法的实现。

mPasswordView.setOnEditorActionListener( TextView.OnEditorActionListener { v, actionId, event ->
    attemptLogin()
    true
})

在这种特定情况下,这是多余的,因为只有一种方法称为setOnEditorActionListener。但是如果有多个具有相同名称的方法,将不同的接口作为参数,则可以使用SAM构造函数指定要调用的方法的重载。

Official docs about SAM conversions

答案 1 :(得分:0)

所以用其他的话来说结构如下(我将在这里留下这是有人需要帮助理解它):

function_A ( parameters_A { override_parameters_B -> override_function_B } )    

其中overriden_function_B是对象的构造函数,名为parameters_A