int i=1;
Runnable r=()->System.out.println(i);
先来说下什么是事实上的final。 如果我声明了一个变量,且在后面不更改它的值,那么那就是事实上的final。
我改下代码
int i=1;
Runnable r=()->System.out.println(i);
i=2;
如果i是局部变量,那么会编译出错。为什么
我们知道,实例变量是储存在堆上面的,是线程贡献的。而局部变量则是保存在栈上的,是线程不共享的。
Lambda是在一个线程当总使用的。java访问局部变量的时候,实际上是去访问他的副本。如果局部变量改变了,那访问的也是之前的值。
所以java8就有了这个限制。