This question already has an answer here:
- Why are only final variables accessible in anonymous class? 13 answers
- Why is the “Variable used in Lambda expression must be final or effectively final” warning ignored for instance variables [duplicate] 2 answers
- Lambdas: local variables need final, instance variables don't 9 answers
When I am writing this code I am getting a compile time error which says: 'Variables in lambdas must be final or effectively final'.
Now, I get this that removing the i from the line :
futureLists.add(executorService.submit( () -> "Hello world" + i));
solves the issue.
But I want to know that why does such a requirement exist?
As per the JLS, all it says is :
Any local variable, formal parameter, or exception parameter used but not declared in a lambda expression must either be declared final or be effectively final, or a compile-time error occurs where the use is attempted.
But it does not state, why such a requirement exist. But why did Java engineers enforce such a requirement for lambdas?
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());
}
}
}