Scala for-loop范围为OutOfMemoryError

时间:2013-04-27 10:16:35

标签: scala for-loop range out-of-memory lazy-evaluation

为什么for {i <- (1 to 1000000000)} println(i)给了我OutOfMemoryError但(1 to 1000000000) foreach println没有?如果我必须使用for循环语法,我该怎么办?

1 个答案:

答案 0 :(得分:2)

这两个片段几乎相同。编译器将scala中的for语法置于foreachflatmapwithFilter以及map的应用程序中(如果使用yield )。此信息可在scala language specification的第6.19节中找到。

这意味着for循环

for (i <- 1 to 1000000000) println(i)

变得卑鄙于

(1 to 1000000000).foreach { case i => println(i) }

几乎相当于

(1 to 1000000000) foreach println

这两个片段都不会导致OutOfMemoryError。您可以查看源代码中foreach的{​​{1}}被覆盖的定义:

https://github.com/scala/scala/blob/v2.10.1/src/library/scala/collection/immutable/Range.scala#L135

只有一个索引变量在循环处理时发生变异。

但是确认索引int没有额外的装箱/拆箱是有用的。事实证明,没有,尽管两种形式的堆栈跟踪略有不同:

Range