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

时间:2015-05-20 10:08:44

标签: java functional-programming

我是函数式编程的新手。我可能对函数式编程(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
}

1 个答案:

答案 0 :(得分:1)

第一个问题: x未复制。它传递给函数f。不变性意味着x将保持不变,其状态在构造之后不会改变,直到对象的生命周期结束。

第二个问题:为了使对象在Java中不可变,其所有字段都应该是不可变的。如果您将List作为字段放在MassiveClass中,则它不再是不可变的。你必须做好防御性复制。