lambda 函数使用成员变量并产生不同的结果

问题描述 投票:0回答:1

我不知道为什么代码运行没有错误。据我所知,在函数式编程中,相同的输入会产生相同的输出,并且函数的内部状态无法从外部更改。当我创建函数“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。

java function lambda java-8 functional-programming
1个回答
0
投票

你是对的,lambda 上有一个闭包,但它带有一个可变对象。

return (m) -> m + value;

这是缩写。

return (m) -> m + this.value;

this
是最终的,在
Function
期间不会改变。
this.value
可以更改,因为这是一个可变的
mine
实例。如果您希望值本身不可变,那么您需要创建一个本地版本,该版本必须是有效的最终版本才能在 lambda 中使用。

int v = this.value;
return (m) -> m + v;

我认为这个新声明可以更好地说明您对函数的期望。

© www.soinside.com 2019 - 2024. All rights reserved.