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