当我编写这段代码时,我遇到了一个编译时错误,错误提示为:'Variables in lambdas must be final or effectively final'。
现在,我明白了从以下代码中移除i可以解决这个问题: futureLists.add(executorService.submit( () -> "Hello world" + i)); 但是我想知道为什么会有这样的要求?
根据JLS的规定,它只说:
“在Lambda表达式中使用但未声明的任何局部变量、形式参数或异常参数必须声明为final或有效final,否则将在尝试使用时出现编译时错误。”
但它没有说明为什么需要这样的要求。那么Java工程师为什么要强制实施这样的要求呢?
现在,我明白了从以下代码中移除i可以解决这个问题: futureLists.add(executorService.submit( () -> "Hello world" + i)); 但是我想知道为什么会有这样的要求?
根据JLS的规定,它只说:
“在Lambda表达式中使用但未声明的任何局部变量、形式参数或异常参数必须声明为final或有效final,否则将在尝试使用时出现编译时错误。”
但它没有说明为什么需要这样的要求。那么Java工程师为什么要强制实施这样的要求呢?
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());
}
}
}