首页 > 其他分享 >lambda表达式使用局部变量要用final

lambda表达式使用局部变量要用final

时间:2022-11-04 14:36:07浏览次数:47  
标签:变量 局部变量 数据类型 匿名 final 表达式 lambda

为什么 Lambda 表达式(匿名类) 不能访问非 final 的局部变量呢?

  因为实例变量存在堆中,而局部变量是在栈上分配,Lambda 表达式(匿名类) 会在另一个线程中执行。如果在线程中要直接访问一个局部变量,可能线程执行时该局部变量已经被销毁了,而 final 类型的局部变量在 Lambda 表达式(匿名类) 中其实是局部变量的一个拷贝。
  在java编译时,匿名内部类也会被当作普通的类处理,只不过编译器生成它构造方法的时候,除了将外部类的引用传递了过来,还将基本数据类型的变量复制了一份过来,并把引用数据类型的变量引用也传递了过来。因此,基本数据类型的变量当然不能修改了,不然就会跟外部的变量产生不一致,这样的话变量的传递也就变得毫无意义了。
 

标签:变量,局部变量,数据类型,匿名,final,表达式,lambda
From: https://www.cnblogs.com/8765h/p/16857663.html

相关文章

  • 关于jfinal包slf4j包的学习
    关于jfinal包slf4j包的学习1.jfinal包1.1jfinal简介公司的就项目使用的是JFinal框架,那么为了读懂并维护公司的项目,则需要对此框架进行学习、了解。JFinal项目开源代......
  • Java函数式编程(1):Lambda表达式(2)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 从之前的Lambda表达式的演变过程可以知道,Lambda表达式其实是一个对匿名内部类的简化过程:去掉了多余的语法修饰,只保留最......
  • Final的用法
    Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。final用来修饰类用其修饰的类后,表明这个类就不能被继承,因此如果是我们不确定这个类是否会作......
  • Java函数式编程(1):Lambda表达式(1)
    您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~Java在其技术发展周期中经历过几次比较重要的变化,如果不是这几次比较重要的变化,恐怕不会有现在这样的江湖地位。个人看来,......
  • 函数式接口与lambda表达式
    函数式接口:只有一个方法的接口publicinterfaceCanAdd{intadd(inta,intb);}该接口作为其他方法的入参,实现函数传递publicclassDog{publicstatic......
  • Java中“成员变量,局部变量,静态变量”三者区别说明
    转自:http://java265.com/JavaCourse/202111/1728.html下文笔者讲述java中成员变量,局部变量,静态变量的不同之处,如下所示: 成员变量局部变量静态变量定义位置......
  • Java函数式编程(1):Lambda表达式(1)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ Java在其技术发展周期中经历过几次比较重要的变化,如果不是这几次比较重要的变化,恐怕不会有现在这样的江湖地位。个人看......
  • Java 中的 Lambda 表达式不能访问局部变量?
    问题现象从Java8开始新增的Lambda表达式,可以使代码变的更加简洁紧凑,使用中还会碰到一个问题:Variableusedinlambdaexpressionshouldbefinaloreffectivelyf......
  • exception中finally的使用
    packagecom.te.exp;/***finally的使用*/publicclassStudyExcep{publicstaticvoidmain(String[]args){try{int[]arr=new......
  • JavaScript全局变量、局部变量的表示方法与例子
    全局变量:有两种表示方法:1.在函数外定义的变量;2.在函数内但没有使用var关键字声明的变量。表示法1例子:varcarName="Volvo";//此处可调用carName变量functionmyFun......