如何使GroupBy返回的地图可变?

时间:2013-01-14 23:52:33

标签: scala

我有一个包含地图的课程。我有一个懒惰的val,它基本上包含以特定格式分组的地图。我想通过一种方法多次使用它,然后在某个时间点清除这个地图。我该如何做这样的事情。

实施例

class A(input: Map[key,value]) {
   private lazy val mapgrouped = input.groupBy(_._1.a)
   def useMap()
   {
       //use the mapgrouped Map multiple times
   }

   def clearMap()
   {
      // clear the mapgrouped field here
   }
}

2 个答案:

答案 0 :(得分:3)

除非你有特殊的性能要求,否则我建议选择var-of-immutable而不是val-of-mutable。前者允许安全发布:读者不一定获得最新版本的数据,但他们保证获得内部一致的快照,其他线程不能篡改。

在你的情况下,我可能会做这样的事情:

private var mMapGrouped: Option[Map[A,B]] = None

def useMap() {
  val map = mMapGrouped.getOrElse {
    val newMap = rebuildTheMap(...)
    mMapGrouped = Some(newMap)
    newMap
  }

  doStuffWith(map)
}

def clearMap() {
  mMapGrouped = None
}

答案 1 :(得分:0)

您无法控制lazy val的评估策略,它们是RHS的一次性评估。

您的分组地图是私有的,因此我假设您不允许Map实例本身泄露。在这种情况下,您可以使Map变为可变,并根据您需要的任何策略重置/重新生成其内容。