函数式编程方法:如何避免在Java中复制对象的开销?

19 浏览
0 Comments

函数式编程方法:如何避免在Java中复制对象的开销?

我是一个函数式编程的新手用户。我可能对函数式编程 (FP) 有误解,但我认为纯 FP 语言不允许可变对象。

我有两个问题。一个是比较理论的,另一个是关于具体的 Java 代码的。

问题1纯 FP 语言如何避免复制对象的性能开销?

var x = getMassiveObject()
var y = f(x)

我认为 x 必须在 f 中复制,因为 x 是不可变的,没有人能触及 x 的内存空间。如果 x 很大,复制的过程似乎需要很长时间。

但我没有看到任何有关这一点的讨论,所以我认为 FP 语言中没有这种开销。

因此,我的第一个问题是:纯 FP 语言如何避免复制不可变的大对象的性能开销?

问题2我想用 FP 的方式构建 Java 程序以避免副效应。 我的第二个问题是:如何重写下面的代码以消除复制的开销?

public void main(){
  MassiveClass m = new MassiveClass();
  MassiveClass n = convert(m);
}
public MassiveClass convert(MassiveClass arg){
  MassiveClass arg2 = deepCopy(arg); // copy arg because arg should not be modified
  arg2.var = 100;
  return arg2
}

admin 更改状态以发布 2023年5月21日
0
0 Comments

第一个问题: x并没有被复制。它被传递给函数f。不可变性意味着x在构造之后直到对象生命周期结束前将保持不变。

第二个问题: 在Java中,为了使一个对象不可变,它的所有字段都应该是不可变的。如果你将List作为MassiveClass中的字段,那么它就不再是不可变的了。你必须进行防御性复制,就像你已经做的那样。

0