Talk is cheap, show me your code!
看一段代码:
/**
* 在lambda表达式内部,修改lambda表达式外部的局部变量的值
*/
private synchronized void updateLocalVariable() {
List<String> list = new ArrayList<>();
list.add("444");
list.add("4444");
int count = 0;
// 这样写会报错。Local variable result defined in an enclosing scope must be final or effectively final
list.stream().forEach(str -> System.out.println("当前是第" + (count++) + "次循环" + str));
}
如果你试图在lambda表达式内部修改外部局部变量的值,请注意,这里的2个限定条件:
1,count在lambda外部。
2,count是局部变量。
那么jvm会无情的告诉你:
Local variable result defined in an enclosing scope must be final or effectively final
原因其实也很简单,本质上就是因为lambda表达式在方法内部,那么lambda表达式的内存分配就是在栈上。栈内存不存在线程安全问题,因为栈内存存的都是变量的副本。
对于局部变量count而言,它的生命周期就是所在方法的生命周期。这就决定了count无法被位于同一个栈帧上的lambda修改,因为这种修改毫无意义,
你无法将你的修改传递出当前栈帧。栈内存不会被共享,也就意味着你没有权利和其他栈帧通信。
如果非要在lambda内部修改lambda表达式外部的局部变量的值呢