kotlin - Kotlin 是否优化了 JVM 中 lambda 的创建?
问题描述
我有一个如下所示的代码:
infix fun <T> Option<T>.valueIs(value : T): Pair<() -> Boolean,Set<Node>> {
val function = {this.selectedValue == value}
val parents = setOf(this)
return Pair(function, parents)
}
val function = {this.selectedValue == value}
我的问题是,每次调用此扩展函数时,Kotlin 是否总是会在 JVM 中创建一个匿名对象,或者它是否具有某种优化以重用它(如果this
并且value
相同)。
解决方案
Kotlin 和 Java 一样,如果您的 lambda 不访问(也称为“捕获”)在其外部声明的变量(包括 ),则可以避免每次创建新对象this
;{this.selectedValue == value}
捕获this
and value
,所以它没有。
你可以想象一些缓存将捕获的变量映射到 lambda 实例,所以它很有效
private val lambdas = mutableMapOf<Any, () -> Boolean>()
infix fun <T> Option<T>.valueIs(value : T): Pair<() -> Boolean,Set<Node>> {
val function = lambdas.getOrUpdate(Pair(this, value)) {this.selectedValue == value}
val parents = setOf(this)
return Pair(function, parents)
}
但:
它可以防止 lambdas 被垃圾收集,以防万一你用相同的方法调用该方法
this
(value
可以通过使用来修复WeakHashMap
);即使忽略这一点,这也不是微不足道的开销;
它要求任何捕获的值都表现良好
hashCode
并且equals
. 好的,无论如何他们都应该拥有它们,但是如果他们不这样做,请想象一下调试时会出现问题!
Kotlin 有另一种非常重要的方法来避免为 lambdas 创建对象:将它们作为参数传递给inline
函数。当然,当您想将 lambda 放入数据结构(甚至像Pair
.
推荐阅读
- javascript - Angular 6+ 中的透明包装器组件
- python - 调用自身内部的函数以使用 if 语句检查错误输入,if 语句永远不会中断和无限循环
- android - 如何将布局创建为从下方弹出的对话框
- service-worker - 不支持请求方法“POST”
- vba - 有没有办法在 MS Word VBA 中使用查找表?
- python - python3 subprocess.run() get 系统找不到Windows docker容器中指定的文件
- matlab - MATLAB图像处理缺失区域
- sql - 如何将列名导出到 redshift 中的文件
- lua - love2d 身体轮廓矩形
- gatsby - 盖茨比:如何克隆具有新类型的节点?