java8内部调用无法引用值的问题
问题:Variable used in lambda expression should be final or effectively final

具体原因:
这段代码试图将 20 赋给一个局部变量,它无法通过编译,但绝非编写错误。
这实际上是语言的设计者有意为之,用以鼓励用户使用 Lambda 表达式获取值而不是变量。
获取值使用户更容易写出没有副作用的代码。
当我们在使用lambda表达式进行函数式编程时候,如何赋值局部变量是不允许的产生这样的原因是因为,lambda表达式是分为及早求值,惰性求值方法俩种方式,因为函数本身就是属于声明式类这样的方式,大大限制了函数内部的拓展使用。
如果一定要使用难免会加大程序的难度和使用,有问题后不易排查,当然这样的问题也不是没有办法,小杨告诉大家方法去处理。
实体类代码:
public static class TestJava8 {
private int id;private String name;private int age;private int type;public TestJava8(int id, String name, int age, int type) {this.id = id;this.name = name;this.age = age;this.type = type;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getType() {return type;}public void setType(int type) {this.type = type;}
}
使用代码:
//方法2参数
public static List result;
//方法1 参数
public List<TestJava8> result1;@Test
public void main() {//1 实际业务过滤返回的业务数据TestJava8 testJava81 = new TestJava8(1, "张三", 20, 1);TestJava8 testJava82 = new TestJava8(2, "李四", 30, 2);List<TestJava8> list = new ArrayList<>();list.add(testJava81);list.add(testJava82);AtomicReference<List<TestJava8>> listAtomicReference = new AtomicReference<>();//2 过滤业务数据操作列入对接第三方平台去获取用户类型数据list.stream().forEach(m -> {//3 业务方法使用TestJava8 testJava83 = new TestJava8(4, "王二", 30, 3);TestJava8 testJava84 = new TestJava8(5, "张兰", 50, 4);List<TestJava8> fliterList = new ArrayList<>();fliterList.add(testJava83);fliterList.add(testJava84);//方法1使用getTestJava8List(fliterList);//方法2 使用DataUtils.setResult(fliterList);//方法3 使用listAtomicReference.set(fliterList);//方式4分布式缓存set});System.out.print("方法一获取:" + JSON.toJSONString(result1));System.out.print("方法二获取:" + JSON.toJSONString(DataUtils.getResult()));System.out.print("方法三获取:" + JSON.toJSONString(listAtomicReference.get()));}public static List<TestJava8> getResult() {return result;
}public static void setResult(List<TestJava8> result) {DataUtils.result = result;
}/*** 方法一 使用获取* @param list* @return*/
public List<TestJava8> getTestJava8List(List<TestJava8> list) {result1 = list;return result1;
}
解决方法一:
编写方法去接收,通过对象属性赋值的特性。
//定一一个集合
public List result;
/**
* 定义本地方法返回
* @param list
* @return
*/
public List getTestJava8List(List list) {
this.result =list;
return result;
}
解决方法二:定静态属性值
静态可以缓存到常量池里面,所以有一定缓存时间,其实这种就是jvm的本地缓存
public static List result;
public static List<TestJava8> getResult() {return result;
}public static void setResult(List<TestJava8> result) {DataUtils.result = result;
}获取://2 过滤业务数据操作列入对接第三方平台去获取用户类型数据list.stream().forEach(m -> {//3 业务方法使用TestJava8 testJava83 = new TestJava8(4, "王二", 30, 3);TestJava8 testJava84 = new TestJava8(5, "张兰", 50, 4);List<TestJava8> fliterList = new ArrayList<>();fliterList.add(testJava83);fliterList.add(testJava84);DataUtils.setResult(fliterList);});
使用:
DataUtils.getResult();
解决方法三:通过cas无锁的机制,内存交换原子操作AtomicReference 通过这个存入数据,既能解决当前的问题,还能保证线程的数据安全问题,通常是用这个。
使用方式:
AtomicReference<List> listAtomicReference = new AtomicReference<>();
//2 过滤业务数据操作列入对接第三方平台去获取用户类型数据
list.stream().forEach(m -> {
//3 业务方法使用
TestJava8 testJava83 = new TestJava8(4, “王二”, 30, 3);
TestJava8 testJava84 = new TestJava8(5, “张兰”, 50, 4);
List fliterList = new ArrayList<>();
fliterList.add(testJava83);
fliterList.add(testJava84);
listAtomicReference.set(fliterList);});
获取: listAtomicReference.get();使用即可
解决方法四:分布式缓存
使用分布式缓存,或者第三方缓存都是能够获取到参数值的,但是对数据的一致性要求不是那么高的时候我推荐使用第三种方式,如果对数据一致性要求比较高的话就使用分布式缓存,多个服务之间共享处理,如果是比较简单单体我推荐使用第一种方式,没有很多并发和请求。
————没有与生俱来的天赋,都是后天的努力拼搏(我是小杨,谢谢你的关注和支持)
相关文章:
java8内部调用无法引用值的问题
问题:Variable used in lambda expression should be final or effectively final 具体原因: 这段代码试图将 20 赋给一个局部变量,它无法通过编译,但绝非编写错误。 这实际上是语言的设计者有意为之,用以鼓励用户使用…...
《嵌入式系统》知识总结10:使用位带操作操纵GPIO
位操作 汇编层面 外设控制常要针对字中某个位(Bit)操作 以字节编址的存储器地址空间中,需要3步骤(读出-修改-写回) 1.(从外设)读取包含该位的字节数据 2. 设置该位为0或1、同时屏蔽其他位&am…...
leetcode 2.两数相加(链表操作)
题目描述跳转到leetcode 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外࿰…...
Jenkins是什么?以及Jenkins有哪些具体的应用呢?
Jenkins是一个流行的开源持续集成和持续交付(CI/CD)工具,它可以自动化构建、测试和部署软件项目。以下是Jenkins的一些具体应用场景: 1. 自动化构建和集成:Jenkins可以与代码版本控制系统(如Git、SVN&#…...
2023年数学建模:参数估计与假设检验:自助法(Bootstrap)详解
2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 1. 引言 2. 自助法简介 3. 自助法在参数估计中的应用 3.1 原理...
华为OD机试真题 Java 实现【字符串通配符】【2022Q4 200分】
一、题目描述 问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。 要求: 实现如下2个通配符: :匹配0个或以上的字符(注:能被和?匹配的字符仅由英文字母和数字0到9组成,下同)?:匹配1个…...
Android 11.0 user模式下解除系统进入recovery功能的限制
1.前言 在11.0的系统rom定制化开发中,系统中recovery模式功能也是很重要的一部分,而在原生系统中,对于debug模式的产品,可以通过电源键和音量+键进入recovery模式, 但是在user模式下的产品,对于通过这种方式,进入recovery模式就受限制了,防止用户无操作为了产品安全等,…...
TDEngine3.0 环境安装、配置及使用经验总结
TDEngine3.0 环境安装、配置及使用经验总结 一、TDengine 介绍二、TDengine的下载三、TDengine Server安装及配置3.1 安装3.2 taos的参数配置3.3 启动3.4 taosAdapter 四、TDengine Client 安装4.1 linux客户端安装4.2 windows客户端安装 五、TDEngine3.x的使用总结 一、TDengi…...
Redis7实战加面试题-高阶篇(Redlock算法和底层源码分析)
当前代码为8.0版接上一步 当前文档源码,接上一篇博客 Redis7实战加面试题-高阶篇(手写Redis分布式锁) 逐步深入,引入Redlock 自研一把分布式锁,面试中回答的主要考点 1.按照UC里面java.util.concurrent.locks.Lock接口规范编写…...
保持Git历史提交整洁,解决冲突
比较常见的场景,在代码提交场景,自己的代码和master冲突了,直接拉取master 解决冲突,很方便快捷,但是这样就会将其他开发同学的commit 拉到我们的分支,团队的代码合入时,需要代码同学帮忙code r…...
CompletableFuture使用详解,多线程相关
CompletableFuture笔记 一. 创建异步任务二.异步回调处理三.多任务组合处理四.总结 原文: https://blog.csdn.net/zsx_xiaoxin/article/details/123898171 CompletableFuture是jdk8的新特性。CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者…...
(3)NUC980 kenerl编译
解压 用到的配置文件位置: /NUC980-linux-4.4.y-master/arch/arm/configs/nuc980_defconfig 执行: 编译linux内核源码。了解其 配置文件在 arch/arm/configs/nuc980_defconfig (1) make nuc980_defconfig 载入配置文件 (2) make menuconfig --->Devi…...
华为OD机试真题 Java 实现【分奖金】【2022Q4 100分】
一、题目描述 公司老板做了一笔大生意,想要给每位员工分配一些奖金,想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序,每个人随机抽取一个数字。按照工号的顺序往后排列,遇到第一个数字比自己数字大的,那么,前面的员工就可以获得“距离 * 数字差值”的奖金。如…...
迅为国产化RK3588开发板在安防前后端应用解决方案
K3588是瑞芯微推出的一款高性能处理器,针对安防领域的应用具备强大的计算能力和图像处理能力。下面是关于RK3588的安防前后端应用解决方案的介绍: 前端摄像头端: 高清视频采集:利用RK3588处理器的高性能图像处理能力,…...
Windows 安装 GCC
文章目录 GCC 是什么?GCC 和 gcc 什么关系?Windows 安装 GCC选型下载安装配置环境变量验证 参考文献 GCC 是什么? GCC(GNU Compiler Collection)是一个开源的编译器套件,由 GNU 项目开发和维护。 GNU 编译…...
下载安装LabVIEW
下载安装LabVIEW 介绍下载安装流程下载安装 后续 介绍 LabVIEW 是 工程 师 用来 开发 自动 化 研究、 验证 和 生产 测试 系统 的 图形 化 编 程 环境。Labview作为图形化编程语言,图形控件拖拽式编程,显得更加直观形象,也很容易上手学习。 …...
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)
目录 1. vector的常用函数 1.1 vector 的介绍 1.2 vector 的初始化 1.3 vector 的操作和遍历 1.4 vector 的容量和增删查改 2. vector 相关笔试题 3. vector 相关OJ题 136. 只出现一次的数字 - 力扣(LeetCode) 解析代码: 118. 杨辉…...
Java NIO-非阻塞I/O(二)
文章目录 1. SocketChannel2. ServerSocketChannel2. Channels类3. 异步通道(Java 7)4. Socket选项5. 就绪选择6. Selector类7. SelectionKey类 1. SocketChannel 通道将缓冲区的数据块移入或移出到个汇总给你I/O,如文件、Socket、数据报等。…...
PaaS平台iuap——数智底座支撑企业的全球化业务拓展
数智化转型是全球化企业非常关注的话题,数智化转型过程中suo 面临的问题与挑战也绝非一套简单的产品能够解决的,必须配合组织、人员、目标制度采用达成目标。iuap平台是整个企业数智化转型的底座,形象来说是我们的土壤,在这个土壤…...
RK3318 android12 HEVC-1080P 4K VP9等格式视频播放不了
同样视频在同样硬件在android10的固件刷机测试播放正常 在android12播放失败,在媒体中心点开视频直接闪退了 在android10 能播放4K视频, 我对比了ddr频率 cat /d/clk/clk_summary | grep ddr android10 clk_ddrmon 0 0 0 24000000 0 0 50000 pclk_ddr 3 3 0 61440000 0 0 5…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
