Объемлющая область действия

454
09 апреля 2019, 16:20

Переменные, определяемые в объемлющей области действия лямбда-выражения, доступны в этом выражении. Например, в лямбда-выражении можно использовать переменную экземпляра или статическую переменную, определяемую в объемлющем его классе. В лямбда-выражении доступен также по ссылке this (явно или неявно) вызывающий экземпляр объемлющего его класса. Таким образом, в лямбда-выражении можно получить или установить значение переменной экземпляра или статической переменной и вызвать метод из объемлющего его класса. Но если в лямбда-выражении используется локальная переменная из объемлющей его области действия, то возникает особый случай, называемый захватом переменной. В этом случае в лямбда-выражении можно использовать только те локальные переменные, которые действительно являются завершенными. Действительно завершенной считается такая переменная, значение которой не изменяется после ее первого присваивания. Такую переменную совсем не обязательно объявлять как final, хотя это и не считается ошибкой. (Параметр this в объемлющей области действия автоматически оказывается действительно завершенным, а у лямбда-выражений собственный параметр this отсутствует.) Следует, однако, иметь в виду, что локальная переменная из объемлющей области действия не может быть видоизменена в лямбда-выражении. Ведь это нарушило бы ее действительно завершенное состояние, а следовательно, привело бы к недопустимому ее захвату.

Это из "Java 8. Полное руководство", Шилдт.

Объясните что все это значит? Что значит объемлющая область действия лямбда-выражений?

Answer 1

Если просто, то из лямбды доступны все поля класса, который эту лямбду содержит, но если мы хотим использовать локальные переменные методов, в которых мы используем лямбду, то они должны быть (final or effectively final) и не могут изменяться внутри лямбды. Например вот так сделать нельзя.

Объемлющая область действия здесь ни что иное, как тело метода. Объемлющий класс - класс, в котором находится этот метод.

P.S. При использовании стримов существует широко распространённый костыль в виде изменения не ссылки на объект, а какого-нибудь его внутреннего поля в лямбде. Практически все эти костыли возможно заменить правильно подобранным коллектором.

READ ALSO
Пульсирующая круглая кнопка

Пульсирующая круглая кнопка

можете подсказать как сделать пульсирующую кнопку?

159
Border обтекающий фигуру

Border обтекающий фигуру

Существует ли у border свойство обтекающее фигуру не зависимо от заданных ширины и высоты? ЗЫ

181
Вставить символ на нужную позицию с помощью регулярных выражений

Вставить символ на нужную позицию с помощью регулярных выражений

Нужно вставить в определенное место строки символ, используя регулярные выраженияУ меня есть только символ для вставки и позиция на которую...

133