Variable used in lambda expression should be final or effectively final 在lambda表达式中出现这个问题,如何结局
时间: 2024-03-01 12:48:28 浏览: 74
编译器说 Lambda 表达式中的变量必须是 final 的,我偏不信
在lambda表达式中出现"Variable used in lambda expression should be final or effectively final"的问题,可以通过以下几种方式解决:
1. 将变量声明为final:将需要在lambda表达式中使用的变量声明为final,这样编译器就不会报错了。例如:
```java
final int num = 10;
Runnable r = () -> {
System.out.println(num);
};
```
2. 将变量声明为effectively final:如果变量在lambda表达式中没有被修改,但没有被声明为final,可以将其声明为effectively final。effectively final指的是变量在初始化后没有再被修改的情况。例如:
```java
int num = 10;
Runnable r = () -> {
System.out.println(num);
};
```
3. 使用局部变量的副本:如果需要在lambda表达式中修改变量的值,可以创建一个局部变量的副本,并在lambda表达式中修改副本的值。例如:
```java
int num = 10;
final int[] numCopy = {num};
Runnable r = () -> {
numCopy[0] = 20;
System.out.println(numCopy[0]);
};
```
4. 使用AtomicInteger等线程安全的类:如果需要在lambda表达式中修改变量的值,并且需要保证线程安全,可以使用线程安全的类,如AtomicInteger。例如:
```java
AtomicInteger num = new AtomicInteger(10);
Runnable r = () -> {
num.set(20);
System.out.println(num.get());
};
```
总结起来,解决"Variable used in lambda expression should be final or effectively final"的问题可以通过将变量声明为final、effectively final,使用局部变量的副本或使用线程安全的类来实现。这样就可以在lambda表达式中使用并修改变量的值了。
阅读全文