在Scala中,如何在不使用var的情况下跟踪运行总计?

del*_*ber 6 scala

例如,假设我希望读取脂肪,碳水化合物和蛋白质,并希望打印每个变量的运行总数.命令式样式如下所示:

var totalFat = 0.0
var totalCarbs = 0.0
var totalProtein = 0.0
var lineNumber = 0

for (lineData <- allData) {
    totalFat += lineData...
    totalCarbs += lineData...
    totalProtein += lineData...
    lineNumber += 1

    printCSV(lineNumber, totalFat, totalCarbs, totalProtein)

}
Run Code Online (Sandbox Code Playgroud)

如何仅使用val来编写上述内容?

mis*_*tor 13

使用scanLeft.

val zs = allData.scanLeft((0, 0.0, 0.0, 0.0)) {  case(r, c) =>
  val lineNr = r._1 + 1
  val fat = r._2 + c...
  val carbs = r._3 + c...
  val protein = r._4 + c...
  (lineNr, fat, carbs, protein)
}

zs foreach Function.tupled(printCSV)
Run Code Online (Sandbox Code Playgroud)