深入浅出理解 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的主要内容,如果未能解决你的问题,请参考以下文章

GO方法集问题cannot use xxxxx as xxxxx value in variable declaration

GO方法集问题cannot use xxxxx as xxxxx value in variable declaration

GO方法集问题cannot use xxxxx as xxxxx value in variable declaration

GO方法集问题cannot use xxxxx as xxxxx value in variable declaration

What's the difference between using “let” and “var” to declare a variable in JavaScript?

warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s in