kotlin - lambda 函数如何替换 Kotlin 中的对象实例?
问题描述
例如,在 Java 中,您将添加一个侦听器而不使用 lambda,如下所示
view.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
}
});
但这可以在 Kotlin 中像这样替换
view.setOnCheckedChangeListener({ compoundButton, b -> true})
新实例创建部分如何处理?lambda 是否处理对象实例的创建?
解决方案
您所指的侦听器是称为SAM 接口或“单一抽象方法”接口的特殊类型的接口。任何只有一个抽象方法的接口都有资格成为 SAM 接口。在 Kotlin 中,您必须显式标记此类接口以fun interface
将其声明为此类,但在 Java 中我们没有这样的机制,因此所有符合条件的 Java 接口在 Kotlin 中都被视为 SAM。
任何 SAM 接口都可以传递一个 lambda 而不是一个对象。运行时将理解此 lambda 旨在被解释为适当接口的实例,并将自动将其包装在必要的代码中。这是(我相信;如果我感到困惑,有人可能会纠正我)曾经在 Kotlin 方面完成过,但是 Java现在也支持 SAM 接口,并且在我看来,看起来 Kotlin 正在编译为现在的 Java SAM 接口机制。
推荐阅读
- c++ - C++ - 使用等号运算符*不*交换两个对象
- java - 与java的smtp连接前景
- javascript - Chart.js 2.7.2-多行获取点值onClick
- java - 如何对地图进行排序和编辑?
- java - 查找和更改数组 Java OOP 的索引
- typescript - 使用 Jest/Typescript 和虚拟函数测试 fs 库函数
- ruby - Mongodb ruby 驱动:编辑 Collection::View 实例过滤器
- javascript - 合并 UI Grid 中的特定列
- php - nginx + php-fpm 产生 300ms 开销
- css - 如何将表单字段与文本内联?