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

}

相关推荐
island13143 小时前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构任务的 Stream 调度机制
开发语言·人工智能·深度学习·神经网络
跳动的梦想家h3 小时前
环境配置 + AI 提效双管齐下
java·vue.js·spring
坚持就完事了3 小时前
Java中的集合
java·开发语言
魔芋红茶3 小时前
Python 项目版本控制
开发语言·python
wjhx4 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
YCY^v^4 小时前
JeecgBoot 项目运行指南
java·学习
云小逸4 小时前
【nmap源码解析】Nmap OS识别核心模块深度解析:osscan2.cc源码剖析(1)
开发语言·网络·学习·nmap
冰暮流星4 小时前
javascript之二重循环练习
开发语言·javascript·数据库
风指引着方向4 小时前
自定义算子开发入门:基于 CANN op-plugin 的扩展实践
开发语言
人间打气筒(Ada)4 小时前
jenkins基于Pipeline发布项目
java·pipeline·jenkins·流水线·ci·cd·cicd