lambda表达式提示变量错误:Variable used in lambda expression should be final or effectively final

2023-11-04

今天在使用lambda表达式时,遇到一个问题。

Variable used in lambda expression should be final or effectively final

 

代码如下:



/**
 * @ClassName: CyclicBarrierDemo
 * @description:
 * @author: XZQ
 * @create: 2020/2/28 10:31
 **/
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(6, () -> {
            System.out.println("召唤神龙");
        });

        for (int i = 1; i <= 7; i++) 
            new Thread(() -> {
                System.out.println("继承第" + i+ "颗龙珠");

            }, String.valueOf(i)).start();
        }
    }
}

 

为什么 Lambda 表达式(匿名类) 不能访问非 final 的局部变量呢? 因为实例变量存在堆中,而局部变量是在栈上分配,Lambda 表达(匿名类) 会在另一个线程中执行。如果在线程中要直接访问一个局部变量,可能线程执行时该局部变量已经被销毁了,而 final 类型的局部变量在 Lambda 表达式(匿名类) 中其实是局部变量的一个拷贝。

通俗点说就是,为了避免匿名子线程开始了之后,还没有执行到System.out.println("继承第" + i+ "颗龙珠");之前,父线程就把i的值改变了,这时候得到的结果就和我们预期的不一样了,而我们又需要不断改变i的值,解决方法其实很简单,就是要使得子线程里用到的值都不要发生变化嘛,再定义一个变量,将i的值赋给它,然后再线程里用到这个变量就行了。

修改如下

 for (int i = 1; i <= 7; i++) {
            int finalI = i;
            new Thread(() -> {
                System.out.println("继承第" + finalI + "颗龙珠");

            }, String.valueOf(i)).start();
        }

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lambda表达式提示变量错误:Variable used in lambda expression should be final or effectively final 的相关文章

随机推荐

  • 丁奇mysql学习笔记-基础篇

    一 mysql的逻辑架构 问题解决 如果表 T 中没有字段 k 而你执行了这个语句 select from T where k 1 那肯定是会报 不存在这个列 的错误 Unknown column k in where clause 你觉得
  • 在Linux安装anaconda3和Pycharm

    第一步 在anaconda3官网下载Linux版本的anaconda3 官网 anaconda3 下载完成后打开终端terminal 进入下载文件的所在目录下 输入ls就可以看到所下载的文件了 第二步 准备安装Anaconda3 进入安装包
  • 【C语言】中,输入一个数组,用for循环实现将输入的n个数字按照从大到小的顺序输出。【通俗简单易懂】

    本篇文章中 我们将讲述在C语言中 输入一个数组 如何用for循环实现将输入的n个数字按照从大到小输出 一 定义数组并初始化 首先 我们定义一个整形的数组并将其初始化 输入n 来决定数组中整数的个数 然后用for循环来输入这个数组中的各个数字
  • mysql用存储过程通过传入的参数id更新字段数据,结果更新了表中所有该字段的数据

    近日一个业务 需要用存储过程实现 其中有一句只是简单的通过id更新字段的语句 但是调用存储过程中发现 会更新表格所有数据 如下图 图一 表中现有数据 需要更新的字段是红框里的 图二 存储过程截图如下 红框里的更新语句 调用存储过程 如图三
  • 二十. Kubernetes 存储挂载

    目录 一 存储挂载 volumes卷的分类 1 EmptyDir 示例 2 hostPath 示例 3 HostDir 示例 4 NFS 网络数据卷示例 持久化卷 二 持久化存储的 PV PVC StorageClass PV 的创建与使用
  • fswebcam一次拍摄多张图片(存在问题)

    初衷 由于树莓派上使用python v4l2capture有问题 因此想了个中间办法 使用fswebcam一次连续拍摄多张图片 fswebcam no banner d dev video0 r 1920x1080 F 15 save 1
  • 一文汇总开源大语言模型,人人都可以拥有自己的ChatGPT

    前言 OpenAI发布的ChatGPT火爆全球以来 全球互联网大厂陆续跟进 纷纷宣布了自家的Chat产品 如Google的Bard 百度的文心一言 阿里的通义千问等等 这些Chat产品背后都是依赖的大语言模型 Large Language
  • keepalive+haproxy实现高可用

    目录 一 搭建环境 1 基本环境 二 修改配置文件 1 建立haproxy配置文件 2 修改haproxy配置文件 3 修改keeplive配置文件 三 启动服务验证 1 HAproxy虚拟机启动haproxy服务和keepalived服务
  • 守护进程的编程规则

    要理解守护进程的编程规则必须先搞明白进程组 会话 组长进程等关系 1 进程组 每个进程除了有一个进程ID之外 还属于一个进程组 进程组是一个或者多个进程的集合 每个进程组都有一个组长进程 组长进程的标识是 其进程ID和进程组ID相等 2 会
  • 基于粒子群算法优化的DBN深度置信网络数据预测及其Matlab实现

    基于粒子群算法优化的DBN深度置信网络数据预测及其Matlab实现 深度置信网络 Deep Belief Network DBN 是一类具有多层结构的前向神经网络 它由多个受限制玻尔兹曼机 Restricted Boltzmann Mach
  • UART串口Shell软硬件模型分析总结

    文章目录 层次一 最底层逻辑配置交互 如何从Uart硬件读写单个字节数据 层次二 抽象串口软件模块交互 基于串口对接输入输出流 和 Printf适配 层次三 类似Shell封装抽象交互 基于串口交互命令行界面 命令解析 补全 修改 记录 c
  • df -h 详解和centos 磁盘清理 /dev/vda1系统盘满了

    df h 检查一台服务器磁盘使用空间 发现磁盘已经使用了100 思路是 1 cd usr 当然这里不一定是 usr目录 最好是cd到 根目录再执行下一步 2 du sh 看哪个目录占用空间大 3 重复前两步 根据实际情况删除或者移走 4 日
  • QT 之键盘事件( keyPressEvent)

    一 介绍 keyPressEvent是QWidget里面的函数 所以凡是继承自QWidget的类都可以通过实现这个函数来完成对按键事件的响应 要让当前的widget能够响应按键事件 最先需要做的事情是 调用 setFocusPolicy Q
  • Vue3动画路由转场

  • PWA及小程序在系统生态方面的支持对比

    PWA代表 渐进式网络应用 Progressive Web Application 它是一种结合了网页和移动应用程序功能的技术概念 PWA旨在提供类似于原生应用程序的用户体验 包括离线访问 推送通知 后台同步等功能 同时又具有网页的优势 如
  • JS new操作符具体做了什么?

    1 意义 在JavaScript中 new 操作符用于创建一个新的对象实例 具体来说 new 操作符会执行以下步骤 JavaScript中的new操作符是一个非常重要的操作符 它用于创建一个新的对象实例 2 实例化步骤 创建一个新的空对象
  • ctfweb入门(13-14)

    ctf show web13 进入题目是个文件上传的题目 尝试了一番文件上传漏洞利用的方法后 没有啥突破 可能有啥隐藏的目录 尝试源码泄露利用的方法 在输入upload php bak时成功下载下来源码 bak文件是备份文件 这里列举一下常
  • 华为机试HJ15 求int型正整数在内存中存储时1的个数

    HJ15 求int型正整数在内存中存储时1的个数 Python 题目 解题思路 代码 结果 代码优化 题目 解题思路 1 输入转整数 用Python的bin方法转为二进制 再按字符串逐个检查等于1 的个数 优化 代码 res 0 for c
  • Ubuntu各个版本下载和安装

    一 下载方式 推荐使用网易镜像站下载 官网下载速度太慢 在官网下载ubuntu 网址 https ubuntu com download desktop 在网易镜像站下载ubuntu 网址 http mirrors 163 com ubun
  • lambda表达式提示变量错误:Variable used in lambda expression should be final or effectively final

    今天在使用lambda表达式时 遇到一个问题 Variable used in lambda expression should be final or effectively final 代码如下 ClassName CyclicBarr