我不知道为什么代码运行没有错误。据我所知,在函数式编程中,相同的输入会产生相同的输出,并且函数的内部状态无法从外部更改。当我创建函数“add”时,它使用变量
value
的值,即 100。加上 5 后结果为 105。但是当我将 value
设置为 10 时,已创建的函数“add”如何变化它的内部状态与 5 相加产生 15?
public class mine {
int value;
public Function<Integer, Integer> createFunction() {
return (m) -> m + value;
}
public void setValue(int value) {
this.value = value;
}
}
public class ClosureCheck {
public static void main(String[] args) {
mine a = new mine();
a.setValue(100);
Function<Integer, Integer> add = a.createFunction();
System.out.println(add.apply(5));
a.setValue(10);
System.out.println(add.apply(5));
}
}
结果:
105 15
换句话说,为什么对于相同的输入,会产生不同的答案?
创建“add”函数后,无论
value
的值如何,我都期望得到相同的答案 105。
你是对的,lambda 上有一个闭包,但它带有一个可变对象。
return (m) -> m + value;
这是缩写。
return (m) -> m + this.value;
this
是最终的,在 Function
期间不会改变。 this.value
可以更改,因为这是一个可变的 mine
实例。如果您希望值本身不可变,那么您需要创建一个本地版本,该版本必须是有效的最终版本才能在 lambda 中使用。
int v = this.value;
return (m) -> m + v;
我认为这个新声明可以更好地说明您对函数的期望。