首先来看一段代码
private void localVarOnce(){
int count = 0;
Runnable runnable = () -> System.out.println(count);
}
在上面这段代码中,lambda可以访问到局部变量count,但是其实,lambda与局部变量之间的关系还是存在一些限制的。 再来看一段代码
private void localVarTwice(){
int count = 0;
Runnable runnable = () -> System.out.println(count);
count = 2;
}
这段代码如果写在idea上的时候,可以在第二个count上看到红线,并且会出现以下提示:
Variable used in lambda expression should be final or effectively final
也就是说,局部变量需要显示的被声明为final或者在事实上是不可变的
原因: 局部变量位于栈上,lambda运行于一个线程当中,如果这个时候lambda去访问变量的时候,持有该变量的线程将其回收,就会出现问题。
参考:java实战(第二版)