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

}

相关推荐
Cloud_Shy6185 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 40 - 43)
android·开发语言·人工智能·笔记·python·学习方法
半只小闲鱼11 分钟前
配置计划模块通用办公设备家具批复数合计计算
开发语言·python
swordbob22 分钟前
缓存延迟双删的两种策略
java·缓存
凡人叶枫22 分钟前
Effective C++ 条款08:别让异常逃离析构函数
java·linux·数据库·c++·嵌入式开发
云烟成雨TD23 分钟前
Agent Scope Java 2.x 系列【4】模型层
java·人工智能·agent
qq_4221525733 分钟前
Word 文件太大怎么压缩?2026 年文档瘦身方案对比
开发语言·c#·word
云烟成雨TD34 分钟前
Agent Scope Java 2.x 系列【5】智能体抽象层
java·人工智能·agent
charliedev38 分钟前
Jedi:Python 自动补全与静态分析的实用工具
开发语言·python·其他
阿伟AI说38 分钟前
Codex 桌面版接入国产模型系列二:Codex++
java·开源软件·ai编程·腾讯云ai代码助手
ji198594431 小时前
MATLAB 求散点曲线斜率
开发语言·算法·matlab