深入浅出理解 Variable used in lambda expression should be final or effectively final

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出理解 Variable used in lambda expression should be final or effectively final相关的知识,希望对你有一定的参考价值。

翻译:lambda 表达式中使用的变量应该是 final 或者有效的 final

原因解析:lambda表达式(多用在线程领域),是由匿名内部类演变来的。

匿名内部类产生的对象一般存放在JVM的堆区域,而局部变量会存放在JVM的栈区域,随着方法调用结束,局部变量就会出栈,被当做垃圾回收掉。

而此时,内部类对象可能还存在,如果内部类对象这时直接去访问局部变量的话就会出问题,因为外部局部变量已经被回收了。

一个解决问题的思路是:将用到的变量在内部类中复制一份。

但这样会造成数据不一致的问题:即使我们在内部类中复制了遍历, 但在执行方法的时候局部变量的值改变了却无法通知匿名内部类。随着程序的运行,会导致程序运行的结果与预期不同

因此,我们需要给复制的变量加上final关键字,使他成为一个常量, 这样就可以被lambda表达式或内部类调用了。


有用就点个赞吧!

以上是关于深入浅出理解 Variable used in lambda expression should be final or effectively final的主要内容,如果未能解决你的问题,请参考以下文章