【发布时间】:2015-08-01 12:26:06
【问题描述】:
我是函数式编程的新手。我可能对函数式编程 (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
}
【问题讨论】:
-
如果你想改变一些东西,但又不想修改原来的东西,那你怎么可能不复制呢?如果您只更改一个字段,则充其量不需要深拷贝。
-
一种选择是使用包装器。我不是说这样做了,但是当然可以让 WrapperClass 扩展 MassiveClass 并通过委托将 MassiveClass 的方法实现为包含的、未修改的大规模。
-
浅拷贝就够了
-
@immibis 谢谢。您的意思是当需要修改实例时,FP 语言总是会受到复制开销的影响?
-
这个问题对函数式编程和可变性有一个很好的答案。 stackoverflow.com/questions/1020653/…,您可能还对 functionaljava.org 上的函数式 Java 感兴趣,并查看 Neal Ford 创建的一些资料,例如 IBM Developer Works 库 ibm.com/developerworks/library/j-ft1 上的系列文章
标签: java functional-programming