为什么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