解释一下这个 Kotlin 函数结构

2024-02-15

我正在使用这个 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
})

您的示例中使用的功能是SAM构造函数 https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions. The 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 允许您通过传入 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 构造函数来指定要调用的方法的哪个重载。

有关 SAM 转换的官方文档 https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解释一下这个 Kotlin 函数结构 的相关文章

随机推荐

  • Java/Kotlin 注释处理器:获取注释字段/属性的类型

    例如我有一堂课 class Foo AnnotatedProp var foo Boolean null 我怎样才能得到类型foo我的自定义注释处理器中的属性 在伪中我期望类似的东西 annotatedElement getStringif
  • Julia 中的 1 元素数组到标量

    将行向量和列向量相乘 我期望结果是标量 但它是一个一维 单元素数组 julia gt 1 2 3 4 5 6 1 element Array Int64 1 32 问题1 这背后的理由是什么 问题 2 将此视为 Julia 的一个怪癖 我想
  • 在 Swift 中解析 CSV 文件

    应用程序启动时 我需要将数据预加载到我的 tableView 中 所以我通过解析 csv 文件来使用核心数据 我正在关注本教程 http www appcoda com core data preload sqlite database 以
  • 在 Angular 4 cli 项目中的何处添加 htaccess 文件以添加重写规则?

    我已经完成了角度项目 现在我想完全使用 htaccess 文件强制更改一些 url 格式 那么我应该将 htaccess 文件放在哪里 我已经尝试过像下面的路径这样的地方 opt lampp htdocs GreatColoradoHome
  • 如何获得每列的平均值,按某分组?

    我正在使用 R 我有一个数据集 group attribute1 attribute2 attribute3 A 1 2 3 A 2 3 4 B 2 4 2 B 2 2 1 如何编写输出函数 group attribute1 attribu
  • 过滤 dataTables.net,不包含过滤框输入

    我想使用DataTables的过滤功能 但不想使用他们的搜索框 在他们的文档中 http datatables net usage featuresbFilter 下显示 请注意 如果您希望在数据表中使用过滤 则必须保持 true 要删除默
  • ResultSet getString 字符编码为 un​​icode 字符

    在我的 swing 应用程序中 我将显示数据库中的印地语 unicode 字符 当我显示名称时 它按原样显示 而不是印地文字符串 但是当我将其硬编码到程序中时 它显示正确 问题是什么 从数据库获取数据时是否有任何字符编码选项 我正在使用 O
  • Titanium api.info 从不在控制台中显示任何内容

    我刚刚开始使用钛 但我无法制造Ti API info 我的日志消息 在控制台中打印任何内容 我尝试在我的 Android 设备 Android 模拟器 iPhone 模拟器中以及 GoogleChrome 中作为移动 Web 项目运行该应用
  • 为此我需要哪种音频播放技术?

    我在选择正确的音频播放技术时遇到了困难 iPhone 上使用了大量的技术 令人眼花缭乱 我需要做的是这样的 开始播放 0 1 到 2 秒之间的短声音 高品质播放 无爆裂声 我听说一些 iPhone 音频播放技术在开始或结束时会发出爆裂声 这
  • 替换标准 Android JSON 解析器以获得更好的性能?

    我知道 Android 有一个内置的 JSON 解析器 但我想知道是否值得使用提供更好性能的东西 比如 Jackson 请参阅http jackson codehaus org http jackson codehaus org 有人试过吗
  • 会议结束后如何获取 Twilio 会议参与者?

    根据 Twiliodocs https www twilio com docs api rest participant list get filters curl G https api twilio com 2010 04 01 Acc
  • Android 6.0.1 - 权限问题 = wifiManager.getScanResults() 返回 0

    PermissionsList add 不起作用 但 MainActivity this requestPermissions 工作正常 问题是它会带来一个对话框 询问用户是否允许位置权限 为什么添加权限不起作用 有没有办法避免对话框 请参
  • Jenkins - 将数组/列表传递给参数化远程构建

    我正在使用 Jenkins 通过以下方式远程运行 Ansible playbookPublish Over SSH命令 这个命令 curl k v X POST https jenkins myhost com job Ansible De
  • 将数据框的列名称作为每列图的标题

    我有一个包含 36 列和 3000 多行的数据框 我正在使用绘图函数for loop绘制每列的图表 我希望图表的标题显示为列名称 我怎样才能做到这一点 for i in c 1 36 plot DowData i type l main c
  • CSS 背景图像未显示高度自动

    我有一个带有背景图像的 div 我必须指定一个以 px 为单位的高度才能显示 但我希望它在宽度调整时以自动高度显示 我被困住了 当我有高度自动时 它根本不显示图像 slider shadow1 z index 9999 margin 0 a
  • Git 挑选那些包含关键字(跟踪 ID)的提交

    出于代码审查的目的 我想 樱桃选择特定提交 与他们一起创建一个新分支并 将该分支推送到远程 这样我就可以将分支 url 提供给同行进行审核 我想创建一个 shell 脚本并发出简单的命令 例如 git review
  • 无法在 sqlfiddle (oracle) 上的选择查询中使用列名

    如果我错误地使用 sqlfidle 或者缺少功能 我不会 重现步骤 选择oracle选项 左上角 创建表并插入数据 CREATE TABLE products P Id int ProductName varchar2 10 UnitPri
  • 如何测试 img 标签是否存在?

    if I do expect img not toBe null 然后我得到一个错误 Error expect called with WebElement argment expected a Promise Did you mean t
  • 从 Azure 中的图像调整器请求接收到 400 错误请求

    ImageResizer 作为 Azure 虚拟应用程序运行 在 ImageResizer 修补程序之后 这在 Azure 模拟中运行良好 但在 Azure 云中遇到问题 如果未指定查询字符串参数并且 URL 重定向到 Blob 存储 则图
  • 解释一下这个 Kotlin 函数结构

    我正在使用这个 Kotlin 函数 我知道我们有一个函数叫做mPasswordView setOnEditorActionListener 采用参数TextView OnEditorActionListener 但是后面是什么 我们的参数里