Lambda表达式提示变量错误:Variable used in lambda expression should be final or effectively final...
注释掉第二行就OK。
分析:根据语法,变量必须为final,但是 a 已经被修改了。
为什么 Lambda 表达式(匿名类) 不能访问非 final 的局部变量呢? 因为实例变量存在堆中,而局部变量是在栈上分配,Lambda 表达(匿名类) 会在另一个线程中执行。如果在线程中要直接访问一个局部变量,可能线程执行时该局部变量已经被销毁了,而 final 类型的局部变量在 Lambda 表达式(匿名类) 中其实是局部变量的一个拷贝。
当然以上情况是在 Lambda 里不在改变值的情况下,如果需要改变值,或者试试还有一种办法就是将整个局部变量声明在 Lambda 里面。