当前位置:网站首页>Variable used in lambda expression should be final or effectively final

Variable used in lambda expression should be final or effectively final

2020-11-10 16:03:01 港岛妹妹

使用JAVA8 对集合操作时,提示Variable used in lambda expression should be final or effectively final

这句话的意思是:lambda表达式中使用的变量应该是final或者有效的final

其实在 Java 8 之前:

匿名类中如果要访问局部变量的话,那个局部变量必须显式的声明为 final

我们知道:

lambda表达式是由匿名内部类演变过来的,他们的作用都是实现接口方法,于是类比匿名内部类,lambda表达式中使用的变量也需要是final类型。

将BorrowerSet赋值到另一个Set中就可以通过编译;

那为什么finalBorrowerSet不是声明为final类型的呢?

其实是因为:

Java 8 之后,在匿名类或 Lambda 表达式中访问的局部变量,如果不是 final 类型的话,编译器自动加上 final 修饰符。

为什么 lambda 表达式或者匿名内部类不能访问非 final 的局部变量,为什么呢?

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

 

版权声明
本文为[港岛妹妹]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4100033/blog/4711330