java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量
时间: 2024-02-24 22:57:32 浏览: 259
编译器说 Lambda 表达式中的变量必须是 final 的,我偏不信
在 Java 中,Lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量,这是因为 Lambda 表达式实际上是对变量的一个引用,而不是对变量的一个副本。如果 Lambda 表达式可以修改本地变量的值,那么这个变量的实际值可能与 Lambda 表达式的预期值不同,这会导致错误或不一致的结果。
最终变量是指在声明后不可以再次被赋值的变量。实际上的最终变量是指被Lambda表达式引用的变量的值在Lambda表达式执行期间不会发生改变,即变量被声明后没有被修改过。
例如,以下代码中的变量 count 是一个最终变量,因为它在声明后没有被修改过:
```
int count = 0;
Runnable r = () -> System.out.println(count);
```
而以下代码中的变量 count 不是一个最终变量,因为它在 Lambda 表达式中被修改过:
```
int count = 0;
Runnable r = () -> {
count++; // 错误!count 不是最终变量
System.out.println(count);
};
```
阅读全文