Lambda表达式常见的Local variable must be final or effectively final原因及解决办法
目录
- Local variable must be final or effectively final
- 错误原因
- 解决办法
- 按照要求定义为final(不符合实情,很多时候是查库获取的变量值)
- 使用原子类存储变量,保证一致性
- AtomicReference
- 常用原子类
- 其它
Local variable must be final or effectively final
错误原因
-
在内部类或匿名内部类中引用了一个在外部类中定义的局部变量,那么这个局部变量必须是
final或effectively final的- Final 变量:指一旦被赋值后不能再修改的变量。
- Effectively Final 变量:没有显式声明为 final,但是在变量初始化后没有被再次赋值的变量。
-
为什么要求局部变量是
final或effectively final,为了保持一致性- 当内部类引用了外部类的局部变量时,实际上内部类会持有该局部变量的一个副本。由于内部类的生命周期可以超过外部方法的执行周期,如果外部方法的局部变量是可修改的,那么当该方法结束后,局部变量可能已经被修改,而内部类还要继续使用旧的值,这就会导致不一致性和错误的结果。
-
Lambda表达式经常遇到这种错是因为它本质上是一个匿名内部类的简化写法。因此需要符合
Local variable must be final or effectively final的规则
解决办法
按照要求定义为final(不符合实情,很多时候是查库获取的变量值)
使用原子类存储变量,保证一致性
Java8API官网
AtomicReference
AtomicReference

我们在这里主要使用set方法存储,以及通过get方法调用
-
比如存储map,调用map
// 存储Map,并且初始化new HashMap<>(),防止空指针 AtomicReference<Map<Long, List<TestEntity>>> atomicMap = new AtomicReference<>(new HashMap<>()); //具体逻辑代码,获取map值 List<TestEntity> entities = this.selectList(null); if (CollectionUtils.isNotEmpty(scriptRelationEntities)) {Map<Long, List<TestEntity>> map = entities.stream().collect(Collectors.groupingBy(TestEntity::getId));if (map != null) {//将map存放到atomicMap atomicMap .set(map);} } //调用map,直接get() if(!atomicMap.get().isEmpty(){atomicMap.get().forEach((key, value) -> {}); }

-
存储list
AtomicReference<List<TestEntity>> atomicList = new AtomicReference<>(new ArrayList<>());
常用原子类
-
AtomicBoolean:用于对boolean值进行原子操作。
AtomicBoolean atomicBoolean = new AtomicBoolean(true); boolean value = atomicBoolean.get(); // 获取当前boolean值 atomicBoolean.set(false); // 设置新的boolean值 boolean success = atomicBoolean.compareAndSet(true, false); // 比较并更新值比如跳出结束循环

-
AtomicInteger:用于对int值进行原子操作。
AtomicInteger atomicInteger = new AtomicInteger(0); int value = atomicInteger.get(); // 获取当前int值 atomicInteger.set(5); // 设置新的int值 int newValue = atomicInteger.incrementAndGet(); // 原子递增并获取新值 -
AtomicLong:用于对long值进行原子操作。
AtomicLong atomicLong = new AtomicLong(0L); long value = atomicLong.get(); // 获取当前long值 atomicLong.set(10L); // 设置新的long值 long newValue = atomicLong.addAndGet(5L); // 原子增加并获取新值 -
AtomicReference:用于对
对象引用进行原子操作。AtomicReference<String> atomicRef = new AtomicReference<>("Hello"); String oldValue = atomicRef.get(); // 获取当前引用值 atomicRef.set("World"); // 设置新的引用值 boolean success = atomicRef.compareAndSet("World", "NewValue"); // 比较并更新 -
AtomicReferenceArray:用于对
对象引用数组进行原子操作。AtomicReferenceArray<String> atomicArray = new AtomicReferenceArray<>(new String[]{"Hello", "World"}); String value = atomicArray.get(0); // 获取索引0处的引用值 atomicArray.set(1, "NewValue"); // 设置索引1处的引用值 boolean success = atomicArray.compareAndSet(0, "Hello", "UpdatedValue"); // 比较并更新 -
AtomicIntegerFieldUpdater:通过反射方式实现对指定类的int字段进行原子操作。
-
AtomicLongFieldUpdater:通过反射方式实现对指定类的long字段进行原子操作。
-
AtomicReferenceFieldUpdater:通过反射方式实现对指定类的引用字段进行原子操作。
-
AtomicStampedReference:带有版本号的原子引用,用于解决ABA问题。
-
AtomicMarkableReference:带有标记位的原子引用,用于解决标记并搭配引用的场景。
其它
AtomicReference<List<String>> 是否等价 AtomicReferenceArray<String>
- 不等价
AtomicReference<List<String>>是一个持有List<String>对象引用的AtomicReference。它提供原子操作来更新和访问对List<String>对象的引用。你可以通过AtomicReference持有的引用来修改和获取列表的内容。
AtomicReference<List<String>> atomicRef = new AtomicReference<>(new ArrayList<>());
List<String> list = atomicRef.get(); // 获取当前列表的引用
list.add("Hello"); // 通过引用修改列表
atomicRef.set(new ArrayList<>()); // 更新对新列表的引用
AtomicReferenceArray<String>是一个持有String对象数组的AtomicReferenceArray。它提供原子操作来更新和访问数组指定索引位置的元素。你可以原子化地修改和访问数组的值。
AtomicReferenceArray<String> atomicArray = new AtomicReferenceArray<>(new String[5]);
String value = atomicArray.get(0); // 获取索引0处的值
atomicArray.set(1, "Hello"); // 设置索引1处的值
boolean success = atomicArray.compareAndSet(2, "OldValue", "NewValue"); // 比较并设置索引2处的值
AtomicReference<List> 操作的是单个对 List 对象的引用,而 AtomicReferenceArray 操作的是一个数组中的元素,每个元素都有独立的索引。因此,根据要操作的数据结构是单个引用对象还是数组,选择合适的原子类非常重要。
相关文章:
Lambda表达式常见的Local variable must be final or effectively final原因及解决办法
目录 Local variable must be final or effectively final错误原因 解决办法按照要求定义为final(不符合实情,很多时候是查库获取的变量值)使用原子类存储变量,保证一致性AtomicReference常用原子类 其它 Local variable must be …...
YOLOv5改进系列(16)——添加EMA注意力机制(ICASSP2023|实测涨点)
【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制 YOLOv5改进系列(2)——添加...
[SSM]GoF之代理模式
目录 十四、GoF之代理模式 14.1对代理模式的理解 14.2静态代理 14.3动态代理 14.3.1JDK动态代理 14.3.2CGLIB动态代理 十四、GoF之代理模式 14.1对代理模式的理解 场景:拍电影的时候,替身演员去代理演员完成表演。这就是一个代理模式。 演员为什…...
桥梁安全生命周期监测解决方案
一、方案背景 建筑安全是人们生产、经营、居住等经济生活和人身安全的基本保证,目前我国越来越多的建筑物逐 步接近或者已经达到了使用年限,使得建筑物不断出现各种安全隐患,对居民的人身安全和财产安全产 生不利影响,因此房…...
图技术在 LLM 下的应用:知识图谱驱动的大语言模型 Llama Index
LLM 如火如荼地发展了大半年,各类大模型和相关框架也逐步成型,可被大家应用到业务实际中。在这个过程中,我们可能会遇到一类问题是:现有的哪些数据,如何更好地与 LLM 对接上。像是大家都在用的知识图谱,现在…...
SpringBoot自动配置、启动器原理爆肝解析(干货满满)
文章目录 前言一、SpringBoot优势概要二、SpringBoot自动配置1. ☠注意☠2.自动配置详解 三、Starter(场景启动器)原理总结 前言 本文详细解析面试重点—SpringBoot自动配置原理、场景启动器原理,深入源码,直接上干货、绝不拖泥带…...
chrome扩展控制popup页面动态切换
文章目录 1、通过控制元素的显示隐藏达到popup页面切换的效果2、通过监听页面重新加载完成不同popup的切换3、直接修改popup页面location.href,无需刷新页面 1、通过控制元素的显示隐藏达到popup页面切换的效果 下面在mv2版本的API下完成 实际上通过控制页面元素实…...
【AI】《动手学-深度学习-PyTorch版》笔记(三):PyTorch常用函数
AI学习目录汇总 1、torch.arange 返回一维张量(一维数组),官网说明,常见的三种用法如下 输入:torch.arange(5) 输出:tensor([0, 1, 2, 3, 4]) 输入:torch.arange(5, 16) 输出:tensor([ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) 输入:torch.arange(1, 25, 2) …...
某文化馆三维建模模型-glb格式-三维漫游-室内导航测试
资源描述 某文化馆某个楼层的三维建模模型,glb格式,适用于three.js开发,可用来做一些三维室内漫游测试和室内导航测试 资源下载地址...
网络安全 Day19-计算机网络基础知识04(网络协议)
计算机网络基础知识04(网络协议) 1. ARP1.1 ARP通讯原理1.2 arp欺骗1.3 ARP欺骗与预防1.4 排查ARP病毒 2. DHCP工作原理(自动分配内网IP)3. TCP协议三次握手、四次挥手原理4. DNS协议工作原理 1. ARP Linux查看arp:ar…...
Verilog语法学习——LV5_位拆分与运算
LV5_位拆分与运算 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 题目描述: 现在输入了一个压缩的16位数据,其实际上包含了四个数据…...
❤️创意网页:创意动态画布~缤纷移动涂鸦~图片彩色打码
✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…...
数值分析第六章节 用Python实现解线性方程组的迭代法
参考书籍:数值分析 第五版 李庆杨 王能超 易大义编 第5章 解线性方程组的迭代法 文章声明:如有发现错误,欢迎批评指正 文章目录 迭代法的基本概念雅可比迭代法与高斯-塞格尔迭代法雅可比迭代法高斯-塞格尔迭代法 迭代法的基本概念 6.1.1引言…...
【低代码专题方案】使用iPaaS平台下发数据,快捷集成MDM类型系统
01 场景背景 伴随着企业信息化建设日趋完善化、体系化,使用的应用系统越来越多,业务发展中沉淀了大量数据。主数据作为数据治理中枢,保存大量标准数据库,如何把庞大的数据下发到各个业务系统成了很棘手的问题。 传统的数据下发方…...
驱动开发 day3 (模块化驱动启动led,蜂鸣器,风扇,震动马达)
模块化驱动启动led,蜂鸣器,风扇,震动马达并加上Makefile 封装模块化驱动,可自由安装卸载驱动,便于驱动更新(附图) 1.安装模块驱动同时初始化各个设备并使能 2.该驱动会自动创建驱动节点. 3.通过c函数程序输入控制各个设备 4.卸载模块驱动 //编译驱动…...
数据结构与算法基础-学习-27-图之最短路径之Dijkstra(迪杰斯特拉)算法
一、最短路径应用案例 例如从北京到上海旅游,有多条路可以到目的地,哪条路线最短,哪条路线最省钱,就是典型的最短路径问题。 二、最短路径问题分类 最短路径问题可以分为两类,第一类为:两点间最短路径。第…...
Windows Server 2012 能使用的playwright版本
由于在harkua_bot里面使用到了playwright,我的服务器又是Windows Server 2012 R2,最新版playwright不支持Windows Server 2012 R2,支持Windows Server 2016以上,所以有了这个需求 https://cdn.npmmirror.com/binaries/playwright…...
css实现溢出变为省略号
单行文本溢出省略 text-overflow:规定当文本溢出时,显示省略符号来代表被修剪的文本 white-space:设置文字在一行显示,不能换行 overflow:文字长度超出限定宽度,则隐藏超出的内容overflow设为hidden&#…...
nginx如何配置两个服务器的连接
nginx 中通过server_name listen的方式配置多个服务器 nginx配置两个站点的windows操作方法,双域名双站点...
Linux环境Arduino IDE中配置ATOM S3
linux选择ubuntu发行版。 硬件设备有多小呢: 功能超级强大。 之前的ROS1和ROS2案例已经全部移植完成并测试结束(三轮纯人力校验😎)。 官网文档信息非常非常好: https://docs.m5stack.com/zh_CN/quick_start/atoms3…...
SpringBoot 整合 MyBatis 完整实战
SpringBoot MyBatis 可以说是国内后端开发最经典、最常用的组合了。本篇文章就来介绍一下SpringBoot如何整合MyBatis,实现数据表的增删改查。一、引言SpringBoot 整合 MyBatis 是国内 Java 后端最主流的持久层方案:• 灵活可控,SQL 可优化、…...
基于WPS云服务架构的Vue文档预览组件技术实现与性能优化
基于WPS云服务架构的Vue文档预览组件技术实现与性能优化 【免费下载链接】wps-view-vue wps在线编辑、预览前端vue项目,基于es6 项目地址: https://gitcode.com/gh_mirrors/wp/wps-view-vue 在微前端架构和云原生应用日益普及的技术背景下,企业级…...
DeepCAD实战指南:AI驱动CAD模型生成的终极解决方案
DeepCAD实战指南:AI驱动CAD模型生成的终极解决方案 【免费下载链接】DeepCAD code for our ICCV 2021 paper "DeepCAD: A Deep Generative Network for Computer-Aided Design Models" 项目地址: https://gitcode.com/gh_mirrors/de/DeepCAD DeepC…...
Qwen3.5-4B-Claude-Opus镜像保姆级教程:双RTX4090D上开箱即用
Qwen3.5-4B-Claude-Opus镜像保姆级教程:双RTX4090D上开箱即用 1. 镜像概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF 是一个基于 Qwen3.5-4B 的推理蒸馏模型,重点强化了结构化分析、分步骤回答、代码与逻辑类问题的处理能力。该版本以 GG…...
HagiCode Soul 平台技术解析:从需求萌发到独立平台的演进之路
先回顾:三次握手(建立连接)核心流程(实际版) 为了让挥手流程衔接更顺畅,咱们先快速回顾三次握手的实际核心,避免上下文脱节: 第一步(客户端→服务器)…...
Tao-8k处理长文本技术详解:突破上下文窗口限制
Tao-8k处理长文本技术详解:突破上下文窗口限制 你是不是也遇到过这样的烦恼?想把一篇几十页的行业报告丢给AI,让它帮你总结要点,结果它告诉你“文本太长了,我处理不了”。或者,你希望AI能帮你分析一个完整…...
告别迷茫!Quartus II 13.1 从新建工程到烧录FPGA的保姆级避坑指南
Quartus II 13.1实战指南:从零开始玩转FPGA开发 第一次打开Quartus II 13.1时,那个灰蒙蒙的界面和密密麻麻的菜单栏确实容易让人望而生畏。作为Altera(现已被Intel收购)旗下经典的FPGA开发工具,它在高校实验室和企业研…...
DRM显示框架中的“导演”:深入理解CRTC如何协同Plane与Connector工作
DRM显示框架中的“导演”:深入理解CRTC如何协同Plane与Connector工作 想象一下,当你在电影院观看一部大片时,银幕上的每一帧画面都经过精心编排——主角的位置、特效的时机、放映机的同步,所有这些元素都需要一个核心指挥者来协调…...
MySQL 5.7.32 Online DDL避坑指南:如何避免主从延迟和锁等待?
MySQL 5.7.32 Online DDL实战避坑:高并发场景下的零停机表结构变更策略 在数据库运维的日常工作中,表结构变更(DDL)操作总是让人又爱又恨。特别是当面对千万级数据表时,一个简单的ALTER TABLE操作就可能引发连锁反应—…...
xgboost 训练一个 限制各个因素相关性的模型
XGB/LGB调参秘籍,解锁新高度! 在机器学习特别是风控模型的应用中,XGBoost和LightGBM因其出色的性能而备受青睐。然而,要充分发挥这些模型的潜力,合理的参数调校至关重要。今天,我们就来深入探讨XGBoost/Lig…...
