在Scala中,与累加器相比,增加foldLeft中的作用域值会产生什么影响

在Scala中,与累加器相比,增加foldLeft中的作用域值会产生什么影响,scala,Scala,Scala与累加器相比,增加foldLeft中的作用域值对堆栈和运行时有什么影响 var counter = 0 val filteredTransformedActivities: List[PushLeadActivity] = partitionRecords.foldLeft(accActivities)( (acc, record) => { if(isRtpRelevantActivity(rec

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
            }
          }
        )

foldLeft的整个第二个参数是一个Function2,它必须以某种方式修改可变变量计数器。如果我没记错的话,这是按如下方式实现的:

生成具有可变成员变量计数器的合成闭包类对象 此对象存储在堆上 作为第二个参数传递给foldLeft的函数保存对此堆驻留对象的引用,并更新其可变变量计数器。 如果在foldLeft中未使用任何可变变量,则无需创建此驻留在堆中的合成对象。我假设这个合成对象的引入要么会对性能产生负面影响,要么会让它慢一点,要么根本没有明显的影响

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


我个人建议不要修改任何内容,除非您发现累加器版本更清晰,它真的那么清晰吗?或者您可以通过分析来表明此可变堆驻留变量对性能有一些显著的负面影响。

感谢您提供的答案,请澄清,他的照片看起来不可能是非负片。“我会支持非少些的。”鲁伯杜克同意,有太多的双重否定。重写一下,希望现在能更清楚一点。