scala case类更新map里面的值

时间:2014-10-27 12:58:46

标签: scala map hashmap case-class

我有:

var targets = mutable.HashMap[String, WordCount]()

WordCount是一个案例类:

case class WordCount(name: String,
                 id: Int,
                 var count: Option[Double]) {

def withCount(v: Double) : WordCount = copy(count = Some(v))
}

我每次在地图中存在密钥时都会尝试更新计数值,

def insert(w1: String, w2: String, count: Double) = {
    if(targets.contains(w1)){
      var wc = targets.get(w1).getOrElse().asInstanceOf[WordCount]
      wc.withCount(9.0)
    } else{
      targets.put(w1, WordCount(w1, idT(), Some(0.0))
    }
}

但它不起作用。这样做的正确方法是什么?请!

1 个答案:

答案 0 :(得分:1)

调用withCount不会修改案例类实例,但会创建一个新实例。因此,您必须再次将新创建的实例存储在地图中:

def insert(w1: String, w2: String, count: Double) = {
  val newWC = targets.get(w1).fold {
    WordCount(w1, idT(), Some(0.0)
  } { oldWC =>
    oldWC.withCount(9.0)
  }
  targets.put(w1, newWC)
}

注意targets.get(w1).fold:获取返回Option[WordCount]fold调用其第一个参数,如果其接收者是None,否则(即其Some它调用第二个参数并将Some包含的值传递给它。