说明这个Kotlin函数结构

问题描述:

我正在使用这个Kotlin函数。我知道我们有一个叫做mPasswordView!!.setOnEditorActionListener的函数,它的参数是TextView.OnEditorActionListener,但那是什么?我们在参数里面有大括号?说明这个Kotlin函数结构

mPasswordView!!.setOnEditorActionListener(TextView.OnEditorActionListener { textView, id, keyEvent -> 
    if (id == R.id.login || id == EditorInfo.IME_NULL) { 
     attemptLogin() 
     [email protected] true 
    } 
    false 
}) 
+0

好吧,我的错误。这不是一个功能...... –

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

了在Java中使用这种方法将是完整的语法:

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

的一到一个转换到科特林会给你:

mPasswordView.setOnEditorActionListener(object: TextView.OnEditorActionListener{ 
    override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean { 
     attemptLogin() 
     return true 
    } 
}) 

科特林,但是,让你使用以更简洁的语法将SAM接口作为其参数的方法,而不是传入lambda。这就是所谓的SAM转换:

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

SAM转换是自动确定哪些接口这个拉姆达对应的,但你可以通过使用一种叫做SAM构造明确指定它,这是什么在你的示例代码。 SAM构造函数返回一个实现给定接口的对象,并将传递给它的lambda传递给它的单个方法的实现。

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

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

Official docs about SAM conversions

+1

“@ OnEditorActionListener”需要什么? – azizbekian

+1

该语法可用于指定在嵌套函数的情况下从哪个函数返回。看到这里:https://kotlinlang.org/docs/reference/returns.html#return-at-labels。但我相信在这个特定情况下它实际上是多余的。 – zsmb13

所以与其他词的结构如下(我只想离开这个这里有人需要帮助,理解它):

function_A (parameters_A { override_parameters_B -> override_function_B })  

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