有效地“修改”ImmutableMap

我们目前正在使用Guava作为其不可变的集合,但我惊讶地发现他们的地图没有方法可以轻松创建新的地图,只需稍作修改。 最重要的是,他们的构建器不允许为键分配新值或删除键。

因此,如果我只想修改一个值,这就是我希望能够做到的:

ImmutableMap<Guid, ImmutableMap> originalMap = /* get the map */; ImmutableMap<Guid, ImmutableMap> modifiedMap = originalMap.cloneAndPut(key, value); 

这就是Guava期待我做的事情:

 ImmutableMap<Guid, ImmutableMap> originalMap = /* get the map */; Map<Guid, ImmutableMap> mutableCopy = new LinkedHashMap(originalMap); mutableCopy.put(key, value); originalMap = ImmutableMap.copyOf(mutableCopy); /* put the map back */ 

通过这样做,我得到了我想要的修改的地图的新副本。 原始副本不受影响,我将使用primefaces引用将事物放回去,因此整个设置是线程安全的。

它只是很慢。

这里有很多浪费的复制品。 假设地图中有1,024个桶。 当你可以按原样使用那些不可变的桶并且只克隆其中一个时,那就是你不必要地再次创建的1,023个桶(也是每个两次)。

所以我想:

  1. 是否有一种Guava实用方法埋藏在某处? (它不在地图或ImmutableMap.Builder中。)

  2. 有没有其他Java库可以做到这一点? 我的印象是Clojure有这样的事情,但我们还没准备好转换语言……

有点出乎意料的functionJava地图像 Guava一样可变。 正如我所料,这个列表是不可变的。

谷歌搜索“持久集合java”提出:pcollections。 有一个Map实现 。

在实际使用任何其他实现之前,我将针对Guava对内存和性能特征进行基准测试。 如果它仍然更好,我不会感到惊讶。