Насколько я понимаю, лямбда-выражения захватывают значения, а не переменные. Например, следующее является ошибкой во время компиляции:
for (int k = 0; k < 10; k++) {
new Thread(() -> System.out.println(k)).start();
// Error—cannot capture k
// Local variable k defined in an enclosing scope must be final or effectively final
}
Однако, когда я пытаюсь запустить ту же логику с расширенным for-loop
все работает нормально:
List<Integer> listOfInt = new Arrays.asList(1, 2, 3);
for (Integer arg : listOfInt) {
new Thread(() -> System.out.println(arg)).start();
// OK to capture 'arg'
}
Почему это работает отлично для расширенных for
цикла, а не для нормального цикла, хотя расширение for
цикла также где - то внутри приращения переменного, как это делалось при нормальном цикле. **