java8内部调用无法引用值的问题

news2024/11/24 6:47:28

问题: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();使用即可

解决方法四:分布式缓存

使用分布式缓存,或者第三方缓存都是能够获取到参数值的,但是对数据的一致性要求不是那么高的时候我推荐使用第三种方式,如果对数据一致性要求比较高的话就使用分布式缓存,多个服务之间共享处理,如果是比较简单单体我推荐使用第一种方式,没有很多并发和请求。

————没有与生俱来的天赋,都是后天的努力拼搏(我是小杨,谢谢你的关注和支持)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优化版本 穿越火线(CF) FPS AI 自瞄 代码 权重 数据集(下面有链接)

更新初衷 本人在制作过程中&#xff0c;有一些爱钻研的朋友来问以及提出增加一些新的功能点回会更好&#xff0c;本着学习研究态度&#xff0c;在第一个版本上进行优化&#xff0c;增加一些内容 不喜欢看过程的小伙伴直接看最下面 界面 解决问题&#xff1a; 1、进入慢 2、无…

PyTorch-完整的模型训练套路

目录 1. 准备 1.1 使用Cifar10 1.2 item的用法 1.3 model的搭建 1.4 数据集、参数设置以及训练开始 1.5 测试集 1.6 使用tensorboard 1.7 保存每一轮的训练结果 2. 计算整体的正确率 3. 其他 3.1 train与eval 3.2 使用GPU训练 1. 准备 1.1 使用Cifar10 1.2 item的…

微信小程序授权登录

微信小程序—授权登录 一、小程序登录 登录流程时序 说明: 1.小程序端调用 wx.login() 获取临时登录凭证code &#xff0c;并回传到开发者服务器。 2.服务器调用 code2Session 接口&#xff0c;换取 用户唯一标识 OpenID 和 会话密钥 session_key。 之后开发者服务器可以根…

2021年长三角高校数学建模竞赛A题Go!Fun游长三角解题全过程文档及程序

2021年长三角高校数学建模竞赛 A题 Go!Fun游长三角 原题再现&#xff1a; 又到一年毕业季&#xff0c;来自浙江杭州的一位大学生小李同学&#xff0c;家境良好&#xff0c;平时学习刻苦&#xff0c;在即将毕业之际&#xff0c;准备给自己安排一个毕业旅行&#xff0c;同时帮助…

Java 高级应用-多线程-实现 Runnable 接口与继承 Thread 类

1.1 程序、进程与线程 • 程序&#xff08;program&#xff09;&#xff1a;为完成特定任务&#xff0c;用某种语言编写的一组指令的集合。即指一段 静态的代码&#xff0c;静态对象。 • 进程&#xff08;process&#xff09;&#xff1a;程序的一次执行过程&#xff0c;或是正…

转变范式:如何使用 5 种新模式重塑 2023 年的实体店体验

在电商盛行的当下&#xff0c;线上购物已成为新零售的重要组成部分&#xff0c;实体零售业正处于两难境地。一方面&#xff0c;实体零售是绝对有必要的&#xff1a;美国约 85% 的销售额来自实体商店。 另一方面&#xff0c;尽管增长放缓&#xff0c;但电商收入占销售总额的比例…

chatgpt赋能python:Python中图形怎么整体下移?

Python中图形怎么整体下移&#xff1f; 在Python中&#xff0c;我们常常需要处理各种各样的图形&#xff0c;但是有时候我们需要将图形进行整体调整&#xff0c;比如将所有图形下移一定距离。那么在Python中&#xff0c;我们该如何实现这个操作呢&#xff1f; 介绍 在Python…

【Linux】3、iptables

文章目录 一、设置其他机器均无法访问 a、b、c 机器的 5432 端口二、设置 d、e 可访问 a、b、c 的 5432 端口三、检查业务是否受到影响 iptables 可在 tcp 协议栈层面限制访问&#xff0c;常用于解决现场的各漏洞。 场景&#xff1a;现场有 a、b、c 三个机器组成的 postgres 集…

经纬恒润AUTOSAR成功适配智芯科技国产车规级芯片

近日&#xff0c;经纬恒润AUTOSAR基础软件产品INTEWORK-EAS-CP成功适配智芯半导体的Z20K14x产品家族。同时&#xff0c;经纬恒润完成了对智芯半导体Z20K14X 产品MCAL软件适配和工程集成&#xff0c;为智芯半导体提供了全套AUTOSAR解决方案。 左图&#xff1a;经纬恒润AUTOSAR E…

iOS 创建组件库

索引库 repo 索引文件(.podspec文件) 1.搭建私有库之前必须要先创建索引库 1&#xff09;首先检查当前电脑的索引库 pod repo 2&#xff09;在gitlab上创建一个新的库&#xff0c;这个库用来保存私有库的podspec文件&#xff0c;所以我们一般起名字最好是 xxxSpec用以区分…

回归预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计学习总结参考资料 预测效果 基本介…

在虚拟机上部署hadoop集群(全流程)

一、单节点部署前置准备 这里一直下一步就好了 接下来需要为该节点固定ip并配置相关网关还有dns解析 这里配置了一个本机dns解析,也配置了一个公网dns解析(主要目的还是为了固定ip

知识变现:知识付费产品,怎么定价?

知识变现&#xff1a;知识付费产品&#xff0c;怎么定价&#xff1f; 定价&#xff0c;是知识博主或者培训机构、用户、竞争对手间博弈平衡后的结果。 200元以下: 只有产品&#xff0c;没有服务。 产品的特征是标准化、大批量。这样的知识产品&#xff0c;要卖给几千、几万…

CSS 实现一个动态水形波浪蒙版层

需求的最终实现效果&#xff0c;如下图&#xff0c;在盒子表面&#xff0c;绘制一个波浪形状的蒙版层&#xff08;动态的&#xff09;。 先定义一个&#xff0c;主体盒子块&#xff0c;等会儿的蒙版图层会覆盖到它的上面。 <div></div>图层采用&#xff0c;SVG进…

Spring Boot 如何自定义异常处理器

Spring Boot自定义异常处理器 在Spring Boot应用程序中&#xff0c;异常处理是一个非常重要的方面。如果您不处理异常&#xff0c;应用程序可能会崩溃或出现不可预料的行为。默认情况下&#xff0c;Spring Boot将未捕获的异常返回给客户端。这通常不是期望的行为&#xff0c;因…

【Java基础】注解与反射

一、学习笔记 &#xff08;本文内容基本源自参考链接1视频教程&#xff09; 1、注解的含义 1&#xff09;注解&#xff08;annotation)是从jdk5.0开始引入的新技术&#xff0c;其作用&#xff1a;不是程序本身&#xff0c;可对程序作解释&#xff08;该作用与注释comment相同…

iOS 性能优化方案-弱网优化

一、iPhone手机弱网环境配置 选择现有网络状态 或自定义网络状态 设置参数: 每个参数的含义大致如下: in bandwidth &#xff1a;下行带宽 in packet loss &#xff1a;下行丢包率 in delay &#xff1a;下行延迟(ms) out bandwidth &#xff1a;上行带宽 out packet los…

【解决】升级g++到8版本

升级g到8版本 g不提高到最新版本在一些操作会头文件报错&#xff0c;因此下面我们配置g编译器 要升级g编译器到版本8&#xff0c;您可以尝试以下步骤&#xff1a; 添加Developer Toolset存储库&#xff1a;在CentOS上&#xff0c;可以使用Red Hat Developer Toolset存储库来获…

PMP课堂模拟题目及解析(第15期)

141. 在新项目的干系人会议中&#xff0c;项目经理发现一名干系人对项目有抵触。项目经理记录这个问题&#xff0c;并对该干系人的参与程度评级。项目经理使用了哪项工具或技术来为干系人的参与程度评级&#xff1f; A. 干系人参与评估矩阵 B. 风险概率和影响评估 C. 人际关…

文件夹显示无法访问、拒绝访问需要权限的解决方法

为了简便管理资料&#xff0c;我们都会选择在电脑上建立文件夹来保存不同作用的资料。文件夹显示无法访问、拒绝访问需要权限的解决方法但是当我们遇到某些文件夹打不开无法访问、拒绝访问时该怎么办呢&#xff1f;这里和大家讲一个方法来解决遇到文件夹无法访问、拒绝访问的这…