java-lambda表达式不能使用非final类型局部变量

为什么 Lambda 表达式(匿名类) 不能访问非 final 的局部变量呢?

  因为实例变量存在堆中,而局部变量是在栈上分配,Lambda 表达式(匿名类) 会在另一个线程中执行。如果在线程中要直接访问一个局部变量,可能线程执行时该局部变量已经被销毁了,而 final 类型的局部变量在 Lambda 表达式(匿名类) 中其实是局部变量的一个拷贝。
  在java编译时,匿名内部类也会被当作普通的类处理,只不过编译器生成它构造方法的时候,除了将外部类的引用传递了过来,还将基本数据类型的变量复制了一份过来,并把引用数据类型的变量引用也传递了过来。因此,基本数据类型的变量当然不能修改了,不然就会跟外部的变量产生不一致,这样的话变量的传递也就变得毫无意义了。

解决方案:

可以使用 java.util.concurrent.atomic 类型变量,示例如下:

public static void main(String[] args) {
AtomicBoolean update= new AtomicBoolean(false);
List<String> fileList= Arrays.asList(new String[]{"123","456"});
fileList.forEach(a->{
update.set(true);
});
System.out.println(update.get());
  //true
}

  

 

posted @ 2022-11-04 14:27  编程笔记  阅读(276)  评论(0编辑  收藏  举报