在Scala中,与累加器相比,在foldLeft中增加范围值会产生什么影响

时间:2018-05-14 15:42:12

标签: scala

Scala与累加器相比,在foldLeft中递增范围值的堆栈和运行时效果是什么

        var counter = 0

        val filteredTransformedActivities: List[PushLeadActivity] = partitionRecords.foldLeft(accActivities)(

          (acc, record) => {

            if(isRtpRelevantActivity(record._2, subscriptionMetadata)){

                try {

                  val listItem: PushLeadActivity = transformer.transform(record._2, subscriptionMetadata).get

                  counter += 1
                  pushLeadActivity +: acc

                } catch {

                  case e: Exception => acc
                }
            } else {
              acc
            }
          }
        )

1 个答案:

答案 0 :(得分:1)

foldLeft的第二个参数是Function2,必须以某种方式修改可变变量counter。如果我没记错的话,这可以通过以下方式实现:

  • 生成具有可变成员变量counter的类似闭包的对象
  • 此对象存储在堆
  • 作为第二个参数传递给foldLeft的函数保存对此堆驻留对象的引用,并更新其可变变量counter

如果您未在foldLeft中使用任何可变变量,则无需创建此驻留堆的合成对象。我假设这个合成对象的引入会对性能产生负面影响(使其慢一点),或者根本没有明显的影响。

foldLeft本身是作为while循环实现的,所以它是堆栈安全的,没有什么可怕的事情发生在这里。

我个人建议不要去修改任何东西,除非你发现累加器版本更清晰(它真的更清楚了吗?),或者你可以通过分析显示这个可变的堆驻留变量对它有一些显着的负面影响。性能