我有一个对象Person
,这个对象经历了数以百万计的独特转换,这些转换必须按顺序完成。
传统上,我可以这样做:
var bob = new Person()
birth(bob)
oneYearOld(bob)
middleSchool(bob)
highSchool(bob)
// ...million more transformations
所以我的问题是,如何在Scala中实现功能(无副作用/纯函数)?如果我使用val bob
,我是否会创建数百万的bob副本,这可能会导致内存问题?
答案 0 :(得分:5)
您可以使用function composition
i(h(g(f(bob))))
执行此操作的一种方法是将所有转换放入序列(或缓冲区或列表或..)中,然后应用它们
val finalBob = functionsSeq.foldleft(bob) { case (xformBob, fn) => fn(xformBob) }
功能组合是为了表达和优雅的清晰。每个转换都将涉及从(不可变的)现有实例生成一个新实例:这是纯函数式编程的主要目标。
fp方法不会为您节省内存消耗/对象生成。但是 - 正如评论者所指出的那样 - 这些对象在堆上,短暂存在,并且易于被垃圾收集器管理/使用。