Lambdas与匿名内部类中的局部变量

问题描述 投票:-2回答:2

在遍历lambda表达式时,我遇到了以下匿名内部类和lambda表达式的行为。这可能是什么原因?

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

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

};

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

O / P

3
4

对于lambda,我在下面得到:

Human h = () -> {

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

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

}

O / P

3
3
java lambda java-8 anonymous-class
2个回答
6
投票

那些不相等。第一个函数在变量范围之外修改变量,而在第二个示例中,每次调用h.sing();时,该函数的主体都被调用。这意味着a变量每次都用值2实例化。


5
投票

您的lambda或多或少等于:

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

没有办法声明具有直接可变状态的lambda。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.