为什么lambda中用到的局部变量需要为final

局部变量

局部变量是存储在栈上的,而栈上的内容在当前线程执行完成之后就会被GC回收掉。

lambda表达式

lambda表达式最终被处理为一个额外的线程去执行。绝对不是上面提到的线程。如果上面的线程执行完了,而这个线程又使用到了上面提到的局部变量会出现错误。

为什么 Lambda 表达式(匿名类) 不能访问非 final  的局部变量呢?因为实例变量存在堆中,而局部变量是在栈上分配,Lambda 表达(匿名类) 会在另一个线程中执行。如果在线程中要直接访问一个局部变量,可能线程执行时该局部变量已经被销毁了,而 final 类型的局部变量在 Lambda 表达式(匿名类) 中其实是局部变量的一个拷贝。

猜你喜欢

转载自www.cnblogs.com/voctrals/p/9990614.html