了解scala集合执行

时间:2017-08-05 13:13:52

标签: scala collections

以下代码几乎永远存在:

val r =(1 to 10000)
   .map(_ => Seq.fill(10000)(0.0))
   .map(_.size)
   .sum

虽然这很快:

val r =(1 to 10000)
   .map(_ => Seq.fill(10000)(0.0).size)
   .sum

为什么?我不会放弃了解语句的执行顺序。在第一种情况下,首先创建10000个10000大小的Seqs,然后将所有那些映射到大小?或者每个Seq是否单独映射到大小(因此是垃圾收集的)?

1 个答案:

答案 0 :(得分:2)

你的假设是正确的。在第一个代码段中,您创建10.000 Seq个实例,然后在第二次迭代中,这些实例将映射到它们的大小。在第二个片段中,不仅不需要存储每个Seq(因为您只对它们的大小感兴趣),而且也不需要额外的迭代。

为了清楚起见,让我们看看它而不用方法链接:

val range = (1 to 10000)

val a1 = range.map(_ => Seq.fill(10000)(0.0)) // all collections are maintained in memory
val a2 = a1.map(_.size)

val b = range.map(_ => Seq.fill(10000)(0.0).size) // each collection can be thrown away asap