为什么for {i <- (1 to 1000000000)} println(i)
给了我OutOfMemoryError但(1 to 1000000000) foreach println
没有?如果我必须使用for循环语法,我该怎么办?
答案 0 :(得分:2)
这两个片段几乎相同。编译器将scala中的for
语法置于foreach
,flatmap
,withFilter
以及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