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

时间:2012-09-27 21:48:34

标签: scala

我需要在Map中累积结果。我已尝试使用.map.reduceLeft.foldLeft(init(m))执行此操作,然后才意识到我没有正确使用它们。 expression来电需要最新的地图才能得到正确答案。

我最终得到了这个,这有效,但我觉得有一个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())

1 个答案:

答案 0 :(得分:2)

我不确定这是否更清晰,但它将避免使用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)
}

应该返回相同的结果