Ход выполнения примера закрытия |Java 8 - PullRequest
0 голосов
/ 03 марта 2019

Впервые рассматривал пример замыкания, но мне было трудно обернуть голову вокруг потока управления.

public class TestLambdaClosure {

    public static void main(String[] args) {

        int a= 10;
        int b=20;
        //doProcess(a, i-> System.out.println(i+b));
        doProcess(a, new Process() {

            @Override
            public void process(int i) {
                System.out.println(i+b);
            }
        });
    }
    public static void doProcess(int i, Process p) {
        p.process(i);
    }

    interface Process{
        void process(int i);
    }
}

Как «b» попадает в область действия, когда p.process (i) называется?Кроме того, как поток управления работает здесь внутренне?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Замыкания позволяют моделировать поведение путем инкапсуляции кода и контекста в одну конструкцию.

Ключевая концепция заключается в том, что ваш код функции (лямбда) можетссылаются не только на свои собственные переменные, но также и на все внешнее, видимое для кода, переменные a и b в вашем случае.

В Java замыкания могут ссылаться только на конечные или эффективные конечные переменные.Это означает, что ссылка на переменную не может быть изменена, и замыкание видит только фактическое неизменяемое состояние (значение на самом деле не является неизменным, окончательное означает, что переменная не может быть переназначена).В теории это не обязательно.Например, в JavaScript вы можете написать такой код:

function newCounter() { 
    let count = 0; 
    return function() { return ++count; }; 
} 
const nc = newCounter(); 
console.log(nc()); // 1 
console.log(nc()); // 2 
console.log(nc()); // 3

Здесь внутренняя функция newCounter по-прежнему имеет доступ к count (ее контекст) и может изменять его (переменная является изменяемой).

Обратите внимание, что переменная counter недоступна для любых других частей вашего кода за пределами замыкания.

0 голосов
/ 03 марта 2019

Замыкания позволяют вам обращаться к переменным в их внешних областях.Внешняя переменная области видимости в этом случае (b) объявляется как то, что java-сообщество теперь называет фактически финальным, то есть ее значение не изменяется с момента инициализации (int b = 20) вЧтобы быть доступным.

Имейте в виду, что переменные должны быть объявлены как окончательные или эффективно окончательные, чтобы это работало как замыкания.

Теперь в отношении вашего кода этот код объявляет doProcess (...) метод, который возвращает метод для частичного выполнения метода doProcess (...) .

Метод process (...) обращается к b во внешней области действия метода doProcess (...) , которыйобъявлено окончательно действительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...