从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量

使用lambda 表达式常常会遇到上面的编译错误。

首先需要知道什么是最终变量或实际上的最终变量:

最终变量(final) :用final关键字修饰的变量,特点是一旦赋值就不能被修改。

实际上的最终变量(effectively final) :没有inal关键字修饰,但是只有一次赋值的变量。

例如这么写就不是实际上的最终变量:

String name = "one";

name = "two"; // 变量被修改,不再是"实际上的最终变量"

Java只所以做这个限制,是为了保障线程安全问题 和**语义一致性问题,**最核心的问题这种场景下,Java是传值调用,lambda使用的是变量的副本。这样解决该问题有两个办法:

1、改为按引用调用。

使用类、数组做参数

2、使用个中间变量来存值

for(int i=0; i<10; i++) { Runnable r = () -> System.out.println(i); } 这样会报错,因为i是变化的。

这样改下就OK:

for(int i=0; i<10; i++) {

int temp = i; // 临时变量,每次循环都是新的、只赋值一次

Runnable r = () -> System.out.println(temp);

}

相关推荐
日月云棠16 小时前
各版本JDK对比:JDK 25 特性详解
java
用户83071968408217 小时前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide17 小时前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
IT探险家18 小时前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺18 小时前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户9083246027318 小时前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端
桦说编程18 小时前
实战分析 ConcurrentHashMap.computeIfAbsent 的锁冲突问题
java·后端·性能优化
程序员清风1 天前
用了三年AI,我总结出高效使用AI的3个习惯!
java·后端·面试
beata1 天前
Java基础-13: Java反射机制详解:原理、使用与实战示例
java·后端
用户0332126663671 天前
Java 使用 Spire.Presentation 在 PowerPoint 中添加或删除表格行与列
java