如果没有参数会编译成 Function0,一个参数编译成 Function1,以此类推。FunctionN 重载了操作符 invoke。如下图所示。
因此我们可以调用 invoke 方法来执行 lambda 表达式。
{ println("lambda 函数体") }.invoke()
当然 Kotlin 也提供了更加简洁的方式,我们可以使用 () 来代替 invoke(),最后的代码如下所示。
{ println("lambda 函数体") }()
到这里我相信小伙伴已经明白了上面代码输出的结果,但是这里隐藏了一个有性能损耗的风险点,分享一段我在实际项目中见到的代码,示例中的代码,我做了简化。
fun main() {
(1..10).forEach { value ->
calculate(value) { result ->
println(result)
}
}
}
fun calculate(x: Int, lambda: (result: Int) -> Unit) {
lambda(x 10)
}
上面的代码其实存在一个比较严重的性能问题,我们看一下反编译后的代码。
每次在循环中都会创建一个 FunctionN 的对象,那么如何避免这个问题,我们可以将 lambda 表达式放在循环之外,这样就能保证只会创建一个 FunctionN 对象,我们来看一下修改后的代码。
fun main() {
val lambda: (result: Int) -> Unit = { result ->
println(result)
}
(1..10).forEach { value ->
calculate(value, lambda)
}
}
最后
这里也分享一些珍藏资源,从面试简历模板到大厂面经汇总,从大厂内部技术资料到互联网高薪必读书单,以及Android面试核心知识点(844页)和Android面试题合集2022年最新版(354页)等等,这些资料整理给大家,希望踩过的坑不要再踩,遭遇的技术瓶颈一次性消灭。
如果需要的话,可以顺手帮我点赞评论一下,直接私信我【笔记】免费领取!
Java部分,像序列化、注解、泛型、反射、JVM、编译时、动态代理等等,都是非常重要的,尤其是越往上走越重要,在大厂中是必问的版块,很多中小厂以及校招也会着重考量Java基础