Kotlin 推荐使用 SAM 注销监听器的方法

2024-01-25

所以我有一个交互器,它使用 Realm 执行插入操作,然后使用 RealChangeListener 通知插入已完成。它是这样的:

fun insertCar(item: Car) {
        realm.doInTransaction {
            val car = Car(...)
            val copy = copyToRealm(car)
            copy.addChangeListener(...)
        }
    }

我可以这样做:

fun insertCar(item: Car, listener: RealmChangeListener<Car>) {
            realm.doInTransaction {
                val car = Car(...)
                val copy = copyToRealm(car)
                copy.addChangeListener(listener)
            }
        }

并像这样访问:

realmInteractor.insertCar(item, RealmChangeListener {
   // do something here
})

但是我无法删除这个监听器

realmInteractor.insertCar(item, RealmChangeListener {
   // do something here
   it.removeChangeListener(this)
})

this将指向其所在的类而不是实际的侦听器

我也可以这样做:

fun insertCar(item: Car, doAfterChange (Car) -> Unit) {
                realm.doInTransaction {
                    val car = Car(...)
                    val copy = copyToRealm(car)
                    copy.addChangeListener(RealmChangeListener{
                    doAfterChange()
                    })
                }
            }

但后来我在另一个 SAM 里面有一个 SAM(我觉得太矫枉过正了)

我可以这样做:

fun insertCar(item: Car, listener: RealmChangeListener<Car>) {
                realm.doInTransaction {
                    val car = Car(...)
                    val copy = copyToRealm(car)
                    copy.addChangeListener(listener)
                }
            }

realmInteractor.insertCar(item, object : RealmChangeListener<Car> {
                        override fun onChange(element: Car?) {
                            ...
                            element?.removeChangeListener(this)
                        }
                    })

这可行,但太冗长了。

那么您如何处理这个问题以及什么是最好的方法呢?


您可以创建一个通用方法来执行一次运行侦听器。大致如下:

fun <T> createInRealm(objectFactory: () -> T, changeListener: (T) -> Unit) {
    realm.doInTransaction {
         val obj = objectFactory()
         val copy = copyToRealm(obj)
         copy.addChangeListener(object : RealmChangeListener<T> {
             override fun onChange(element: T) {
                 changeListener()
                 element.removeChangeListener(this)
             }
         }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin 推荐使用 SAM 注销监听器的方法 的相关文章

随机推荐

  • Rails 在集成测试中设计经过身份验证的路由

    我想测试应用程序中的每条路线 并了解到我应该在集成测试中执行此操作 在 ruby on Rails 中测试路线的位置 https stackoverflow com questions 5290245 where to test route
  • Python:如何在给定时间调用字典包含的可调用对象?

    我正在使用 python 中的字典对象 其中包含许多键 它们的一些关联值类型是可调用类型 就像是 dico key1 1 key2 cars key3
  • Spark Streaming:接收器故障后如何不重新启动接收器

    我们正在使用自定义 Spark 接收器 它从提供的 http 链接读取流数据 如果提供的http链接不正确 则接收失败 问题是spark会不断重启接收器 并且应用程序永远不会终止 问题是如果接收器失败 如何告诉 Spark 终止应用程序 这
  • DIV 水平和垂直居中[重复]

    这个问题在这里已经有答案了 有没有办法垂直和水平居中 DIV但是 这一点很重要 当窗口小于内容时 不会剪切内容 div 必须具有背景颜色以及宽度和高度 我总是使用绝对定位和负边距将 div 居中 如提供的示例中所示 但它有一个问题 就是把上
  • 按条件动态搜索

    我在用QueryDSL with Spring Data Jpa我想执行一些动态搜索 我遵循这个Answer https stackoverflow com a 23896303 3756879没关系BooleanBuilder但就我而言
  • 以编程方式打开和关闭 Chart.js 工具提示

    Chart js 2 2 1 知道如何触发当我将鼠标悬停在数据点上时运行的代码以及当我将鼠标移开时运行的代码吗 我需要以编程方式显示和隐藏图表的工具提示 openTip oChart datasetIndex pointIndex how
  • 如何在 Windows Powershell 中获取 Azure Active Directory 用户名?

    我正在尝试从 Windows 10 Azure Active Directory AAD 加入的计算机上的 Powershell 获取当前的 Windows 用户名和域 我已经尝试过以下提示这个问题 https stackoverflow
  • PHP 中 C++ 的虚函数相当于什么?

    Is it abstract function xxx 我刚刚做了一个测试 似乎表明私有方法也是虚拟的 class a private function test echo 1 class b extends a private funct
  • 转换后的数组中的第 K 个元素

    我在最近的采访中遇到了这个问题 给定一个数组A长度N 我们应该回答Q查询 查询表格如下 Given x and k 我们需要创建另一个数组B具有相同的长度使得B i A i x where 是异或运算符 对数组进行排序B按降序排列并返回B
  • 如何在 Spring Data Rest 应用程序中的实体之间创建引用

    我正在尝试使用 Spring Boot Data Rest JPA 构建简单的应用程序 A 具有具有一对多关系的 Category 和 Book 实体 Entity public class Category Id GeneratedVal
  • 如何使用 AngularJS 同时 ngShow 和 ngHide 两个不同的元素?

    所以我有两个独特的元素 span foo span span bar span 我向其中添加了 ngShow 和 ngHide span foo span span bar span 但现在 当这些渲染时 它们会在一瞬间同时显示 如何让它们
  • 使用 Java 打开 Microsoft Word docx 文件

    如何用 Java 打开 Microsoft Word docx 文件 此外 如果它受密码保护 我该如何打开它 例如 File f new File hello docx 请尽量避免回答诸如 你不应该这样做 之类的话 我这样做是有充分理由的
  • 在 MVC 中显示来自 IMAGE 对象的图像

    我有一个 IMAGE 类型的对象 它保存图像 我想在 MVC 视图中显示图像以及其他控件 我能想到的方法是将图像临时存储在磁盘上并设置img控件的src 我确信会有更好的方法来做到这一点 我认为最简单的方法是返回FileStreamResu
  • Google Cloud - 尽管接受密钥,服务器仍拒绝公钥签名

    我想使用以下命令将文件从本地计算机 Windows 10 复制到虚拟机实例 gcloud compute scp zone us central1 a C Users root Downloads sql sandbox var www h
  • Django 1.7 迁移错误

    我在名为 Availability 的模型上将字段从 CharField 更改为foreignkey 当我尝试迁移时 我不断收到以下错误 ValueError Lookup failed for model referenced by fi
  • 在 Spinner 上设置文本

    这是 AccountListView 它检索并显示我在列表视图中添加到数据库中的数据 我添加了现金和银行帐户 当我在列表视图中单击现金时 它会打开交易意图 其中有一个旋转器添加了哪些现金和银行 我希望它显示我在列表视图中单击的数据 请注意
  • 如何恢复原来的窗口intellij布局

    我没有选择 恢复默认布局 而是错误地选择了 将当前布局存储为默认布局 因此我当前的布局 我不想使用 被设置为默认布局 现在我不能再去原来的布局了 有没有办法将布局重置为其出厂值 我使用的是intellij 12 1 1 Windows7 布
  • 确保另一条记录尚未包含相同的字段值

    我正在使用 C MVC 为自己的学术目的构建一个小型内容管理系统 我有创建页面的功能 列表页面 删除页面等 在基本层面上 我使用 ID 来验证所有页面的唯一性 但当我使用 MVC 时 页面本质上是一个视图 并且它可以包含剃刀 这一切都没有问
  • python中计数器的求和列表

    我正在寻找 python 中的计数器列表的总和 例如求和 counter list Counter a 1 b 2 Counter b 3 c 4 to give Counter b 5 c 4 a 1 我可以得到以下代码来进行求和 cou
  • Kotlin 推荐使用 SAM 注销监听器的方法

    所以我有一个交互器 它使用 Realm 执行插入操作 然后使用 RealChangeListener 通知插入已完成 它是这样的 fun insertCar item Car realm doInTransaction val car Ca