我有一些可变的 scala 代码,我正试图以更实用的方式重写它们。这是一段相当复杂的代码,所以我试图将其重构。我的第一个想法是这样的:
def iterate(count:Int,d:MyComplexType) = {
//Generate next value n
//Process n causing some side effects
return iterate(count - 1, n)
}
iterate(2000000,initialValue)
这对我来说似乎根本不起作用,因为我的代码中仍然混合有副作用。我的第二个想法是这样的:
def generateStream(d:MyComplexType):Stream[MyComplexType] = {
//Generate next value n
return Stream.cons(n, generateStream(n))
}
for (n <- generateStream(initialValue).take(2000000)) {
//process n causing some side effects
}
这对我来说似乎是一个更好的解决方案,因为至少我已经将我的函数值生成代码与可变值处理代码隔离开来。但是,这大大降低了内存效率,因为我正在生成一个我并不真正需要存储的大列表。
这让我有 3 个选择:
- 写一个尾递归函数,咬紧牙关重构值处理代码
- 使用惰性列表。这不是一个内存敏感的应用程序(虽然它是性能敏感的)
- 想出一个新的方法。
我想我真正想要的是一个懒惰的评估序列,我可以在处理完这些值后丢弃它们。有什么建议么?