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
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具