> 文章列表 > Lambda 表达式中的变量必须是 final 的吗

Lambda 表达式中的变量必须是 final 的吗

Lambda 表达式中的变量必须是 final 的吗

如果我们定义了一个变量,想要在Lambda 表达式中修改变量的值,编译器会发出警告:“variable used in lambda expression should be final or effectively final”。

比如对一个list进行遍历,遍历的过程中对i进行操作
Lambda 表达式中的变量必须是 final 的吗

Java 规范中是这样规定的:

Any local variable, formal parameter, or exception parameter used but not declared in a lambda expression
must either be declared final or be effectively final (§4.12.4),
or a compile-time error occurs where the use is attempted.

Lambda 表达式中要用到的,但又未在 Lambda 表达式中声明的变量,必须声明为 final 或者是 effectively final,否则就会出现编译错误。

实际上都是要保证变量在lambda表达式中不做更改

final int a;
a = 1;
// a = 2;
// 由于 a 是 final 的,所以不能被重新赋值int b;
b = 1;
// b 此后再未更改
// b 就是 effectively final

解决

变量声明为 static

Lambda 表达式中的变量必须是 final 的吗

变量声明为 Atomic原子类

这种方式是编译器推荐的一种方式
Lambda 表达式中的变量必须是 final 的吗
Lambda 表达式中的变量必须是 final 的吗