解释这个Kotlin函数结构

我正在使用这个Kotlin函数。 我知道我们有一个名为mPasswordView!!.setOnEditorActionListener的函数,它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 }) 

在你的例子中使用的function是一个SAM构造函数 。 setOnEditorActionListener侦听器将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允许您使用以更简洁的语法使用SAM接口作为其参数的方法,而不是传入lambda。 这被称为SAM转换:

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

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

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

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

有关SAM转换的官方文档

所以换句话说,结构是以下(我会留在这里有人需要帮助理解):

 function_A ( parameters_A { override_parameters_B -> override_function_B } ) 

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