有效地“修改”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个桶(也是每个两次)。
所以我想:
-
是否有一种Guava实用方法埋藏在某处? (它不在地图或ImmutableMap.Builder中。)
-
有没有其他Java库可以做到这一点? 我的印象是Clojure有这样的事情,但我们还没准备好转换语言……
有点出乎意料的functionJava地图像 Guava一样可变。 正如我所料,这个列表是不可变的。
谷歌搜索“持久集合java”提出:pcollections。 有一个Map实现 。
在实际使用任何其他实现之前,我将针对Guava对内存和性能特征进行基准测试。 如果它仍然更好,我不会感到惊讶。