从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);

}

相关推荐
云烟成雨TD14 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
Wenweno0o14 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
于慨14 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
swg32132114 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
gelald14 小时前
SpringBoot - 自动配置原理
java·spring boot·后端
殷紫川14 小时前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java
一轮弯弯的明月14 小时前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
chenjingming66615 小时前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
殷紫川15 小时前
深入拆解 Java volatile:从内存屏障到无锁编程的实战指南
java
eddieHoo15 小时前
查看 Tomcat 的堆内存参数
java·tomcat