Локальные переменные в Lambdas против анонимных внутренних классов - PullRequest
0 голосов
/ 25 апреля 2020

Проходя через лямбда-выражения, я столкнулся с приведенным ниже поведением для анонимных внутренних классов и лямбда-выражений. Что может быть причиной этого?

Human h = new Human() {
int a = 2;
@Override
public void sing() {

System.out.println(++a);
}

};

h.sing();
h.sing();

O / P

3
4

В то время как для лямбд я получаю ниже:

Human h = () -> {

int a = 2;
System.out.println(++a);
};

h.sing();
h.sing();

}

O / P

3
3

Ответы [ 2 ]

6 голосов
/ 25 апреля 2020

Это не эквивалентно. Первая функция изменяет переменную вне ее области видимости, тогда как во втором примере каждый раз, когда вы вызываете h.sing();, вызывается тело этой функции. Это означает, что a переменная создается каждый раз со значением 2.

5 голосов
/ 25 апреля 2020

Ваша лямбда более или менее эквивалентна:

Human h = new Human() {
    @Override
    public void sing() {
        int a = 2;    
        System.out.println(++a);
    }
};
h.sing();
h.sing();

Нет способа объявить лямбду с напрямую изменяемым состоянием.

...