Scala var/val局部变量最佳实践

Scala var/val局部变量最佳实践,scala,Scala,我需要在地图中积累结果。在意识到我没有正确地使用它们之前,我已经尝试过使用.map、.reduceLeft和.foldLeft(init(m))。表达式调用需要最新的映射才能得到正确答案 我最终得到了这样的结果,这是可行的,但我觉得有点脏,因为有一个var映射在循环中得到更新。从Scala最佳实践的角度来看,这是否可以接受?有没有更好的方法可以把它改写得更地道 val acc = "some key name" val id = "some other key name" val myColl

我需要在地图中积累结果。在意识到我没有正确地使用它们之前,我已经尝试过使用
.map
.reduceLeft
.foldLeft(init(m))
表达式
调用需要最新的映射才能得到正确答案

我最终得到了这样的结果,这是可行的,但我觉得有点脏,因为有一个
var
映射在循环中得到更新。从Scala最佳实践的角度来看,这是否可以接受?有没有更好的方法可以把它改写得更地道

val acc = "some key name"
val id = "some other key name"
val myColl = List(1, 2, 3, 4, 5)

// oversimplification (these things actually do work and access other keys in the map)
def expression(m:Map[String, Int]) = (m(acc)) + (m(id))
def init(m:Map[String, Any]) = 0

// can this be made better?
def compute(m: Map[String, Int]) = {
  var initMap = m + (acc -> init(m))
  for(k <- myColl) {
    initMap = initMap + (id -> k)
    val exp = expression(initMap)
    initMap = initMap + (acc -> exp)
  }
  initMap(acc)
}

compute(Map())
val acc=“一些密钥名称”
val id=“其他一些密钥名称”
val myColl=List(1,2,3,4,5)
//过于简单化(这些东西实际上可以工作并访问地图中的其他键)
def表达式(m:Map[String,Int])=(m(acc))+(m(id))
def init(m:Map[String,Any])=0
//这能做得更好吗?
def compute(m:Map[String,Int])={
var initMap=m+(acc->init(m))
对于(k)
val exp=表达式(initMap)
initMap=initMap+(acc->exp)
}
初始映射(acc)
}
计算(映射())

我不确定这是否更干净,但它将避免使用var:

def compute(m:Map[String, Int]) = {
  val initMap = myColl.foldLeft(m + (acc -> init(m)))( (e, k) => 
    e + (id -> k) + (acc -> expression(e + (id -> k))))
  initMap(acc)
}

应该返回相同的结果

我喜欢它。我将通过预先计算其中的一些值来让它更干净一些。暂时接受。:)