Что такое замыкание?
Что проверяют
Знаете ли вы, что Java захватывает копию значения и требует effectively final, и понимаете ли, чем лямбда отличается от анонимного класса. Формулировка «функция, которая помнит окружение» тут недостаточна, потому что в Java семантика другая.
Как отвечать
Замыканий в полном смысле в Java нет. Лямбда и анонимный класс захватывают локальную переменную копией, и захватить можно только effectively final, то есть переменную, которая после инициализации не меняется. Поля объекта и статические поля это другая история: они доступны по ссылке и меняться могут.
public static Function<Integer, Integer> multiplier(int factor) {
return n -> n * factor; // factor скопирован в момент создания
}Причина ограничения в том, что локальная переменная живёт на кадре стека, который исчезнет раньше объекта функции, а копия заодно снимает вопрос видимости изменений между потоками. Если нужно изменяемое состояние, берут поле объекта или AtomicInteger; массив из одного элемента формально работает, но это обход правила, а не решение.
Отличия лямбды от анонимного класса стоит назвать сразу: ссылка на себя в лямбде указывает на объемлющий экземпляр, у анонимного класса своя; лямбда не порождает отдельный файл класса и связывается динамически, а незахватывающая лямбда может переиспользоваться одним экземпляром.
Где спотыкаются
Пытаются менять переменную из лямбды, получают ошибку компиляции и оборачивают её в массив из одного элемента вместо того, чтобы переписать код на reduce или сбор результата в коллекцию.
Говорят, что Java захватывает по ссылке, и после этого не могут объяснить требование effectively final. Проверяющий обычно спрашивает следом, что будет видно внутри, если поменять переменную после создания лямбды.
Не помнят, что анонимный класс держит ссылку на внешний экземпляр. Долгоживущий колбэк или слушатель удерживает весь объект вместе с его полями, и на мобильном клиенте это классический источник утечек. Туда же идёт утверждение, что замыкание даёт приватные переменные: в Java инкапсуляцию обеспечивает класс, а не захват.