过滤Scala流期间的StackOverflowError

时间:2013-03-30 15:42:08

标签: scala

我正在尝试使用谓词过滤流,但是当我尝试将流转换为包含谓词返回false的元素的列表时,我收到错误。

def machine(n:Int) = if (n==0) List(0) else List(n/2,n/3,n/4)
def greater(n:Int) = machine(n).sum > n

val d: Stream[Int] = 2 #:: d.map(_+1).filterNot(greater)

scala> d.take(11).toList
res41: List[Int] = List(2,3,4,5,6,7,8,9,10,11)

//12 is the first number for which greater will return true
scala> d.take(12).toList
//Returns a ton of scala.collection.immutable.Stream errors

有人可以向我解释这里到底出了什么问题吗?感谢。

1 个答案:

答案 0 :(得分:2)

代码以递归方式工作。当您的流中的项目用完时,递归会让您无处可去,并最终耗尽堆栈空间。 (当你要求更多的项目而不是可能在你的流中时,你期望发生什么呢?因为你过滤掉了所有大的项目?你应该得到一个堆栈溢出或非终止(挂起),对吗?)