Как работают захваты переменных (
variable capture) в лямбда-выражениях Java, и какие ограничения на них накладываются?Ответ ⬇️
В Java лямбда-выражения могут использовать переменные из окружающего контекста, но только если они являются effectively final (фактически финализированными). Это значит, что переменная должна быть объявлена как final или её значение не должно изменяться после инициализации.
Это ограничение связано с тем, что лямбды могут выполняться в другой потоковой среде, и изменение переменной вне лямбды может привести к непредсказуемым результатам.
Пример использования ⚙️
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
int base = 10;
Consumer<Integer> multiplier = value -> {
System.out.println(value * base); // Использование захваченной переменной
};
multiplier.accept(5); // Вывод: 50
// base = 20; // Ошибка компиляции: переменная должна быть effectively final
}
}
Java Learning 👩💻