为什么lambda中的变量必须是最终变量或有效最终变量?[重复]

当我编写此代码时,我收到一个编译时错误,该错误是: 。

现在,我从行中删除了 :

解决了这个问题。

但是我想知道为什么存在这样的要求?

根据JLS,它只表示:

使用但未在lambda表达式中声明的任何局部变量,形式参数或异常参数必须声明为final或有效地为final,否则在尝试使用时会发生编译时错误。

但是它没有说明为什么存在这样的要求。但是,为什么Java工程师对lambda强制执行这样的要求?

public class test {

public static void main(String[] args) throws ExecutionException, InterruptedException {

ExecutorService executorService = Executors.newFixedThreadPool(10);

List<Future<String>> futureLists = new ArrayList<>();

for (int i = 0; i < 20; i++) {

futureLists.add(executorService.submit( () -> "Hello world" + i));

}

for (Future<String> itr:futureLists) {

System.out.println(itr.get());

}

}

}

回答:

它与多线程编程有关。

到目前为止,Java中的局部变量不受竞争条件和可见性问题的影响,因为它们只能由执行声明它们的方法的线程访问。但是可以将lambda从创建它的线程传递到另一个线程,因此,如果第二个线程评估的lambda具有对局部变量进行突变的能力,则其免疫力将因此丧失。-

来源

以上是 为什么lambda中的变量必须是最终变量或有效最终变量?[重复] 的全部内容, 来源链接: utcz.com/qa/432454.html

回到顶部