是否可以将函数式编程应用于Scala流,以便顺序处理流,但流的已处理部分可以被垃圾收集?
例如,我定义了一个Stream包含从数字start到end:
def fromToStream(start: Int, end: Int) : Stream[Int] = {
if (end < start) Stream.empty
else start #:: fromToStream(start+1, end)
}
Run Code Online (Sandbox Code Playgroud)
如果我以函数式总结值:
println(fromToStream(1,10000000).reduceLeft(_+_))
Run Code Online (Sandbox Code Playgroud)
我得到一个OutOfMemoryError- 也许是因为调用的堆栈帧reduceLeft保存了对流的头部的引用.但如果我以迭代方式执行此操作,它的工作原理如下:
var sum = 0
for (i <- fromToStream(1,10000000)) {
sum += i
}
Run Code Online (Sandbox Code Playgroud)
有没有办法以功能的方式做到这一点而没有得到OutOfMemory?