Lambda表达式捕获修改外部变量:能否递增主函数counter值?
Kotlin Lambda中能否递增主函数内的counter变量?
你的示例代码不能实现counter的递增,问题出在lambda的调用方式上。
先看你提供的代码:
fun main(){ var counter = 0 val incr = { ++counter} incr println(counter) // 输出0 }
这里的incr只是lambda对象的引用,你仅写出变量名但未执行它,++counter的逻辑根本没触发,counter的值自然保持初始的0。
为什么Lambda能修改外部变量?
Kotlin的lambda支持捕获外部作用域的可变变量(var修饰的),它会把这类变量包装成带引用的容器(规避Java中“有效final”的限制),只要正确调用lambda,就能修改外部变量的值。
正确实现的代码
只需把incr改成incr(),执行这个lambda:
fun main(){ var counter = 0 val incr = { ++counter} incr() // 调用lambda执行递增逻辑 println(counter) // 输出1 }
运行后counter的值会成功递增到1。
额外补充:如果是val修饰的变量,lambda只能读取它的值,无法直接修改;但如果变量是可变对象(比如MutableList),可以修改对象内部的状态。
内容的提问来源于stack exchange,提问作者Ken Kiarie
相关产品推荐
相关产品推荐

