2012-02-01 25 views
13

現在、不変なコレクションにGuavaを使用していますが、小さなマップで簡単に新しいマップを作成する方法はありません。また、ビルダーは、キーに新しい値を割り当てたり、キーを削除したりすることはできません。ImmutableMapを効率的に「変更する」

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

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

が、それはグアバのように見える私は何を期待されているものです。

だから私はただ一つの値を変更したい場合は、ここで私が行うことができるようにしたいものです

これを行うことで、私が望む変更を加えて地図の新しいコピーを得ることができます。元のコピーは変更されていません。アトミックな参照を使用してその設定を元に戻し、セットアップ全体がスレッドセーフであるようにします。

これは遅いです。

ここでは、無駄なコピーがたくさんあります。マップに1,024個のバケットがあるとします。それはあなたが不必要にバカットをそのまま使用し、そのうちの1つだけを複製することができたときに、不必要に全面的に(それぞれ2回ずつ)作成するバケツです。

だから私は推測:

  1. は、この種のもののためにどこかに埋もれグアバユーティリティ方法はありますか? (マップやImmutableMap.Builderにはありません)

  2. この種のものを取得するJavaライブラリはありますか?私は... Clojureのは、ボンネットの下にこの種のものを持っていますが、我々はまだ言語を切り替えること準備ができていないという印象の下

+0

必要に応じて機能要求を提出してください。しかし、おそらく実際の機能データ構造のライブラリを探していると思います。 –

+0

これはできることです - それが関数型言語の機能ですが、それはGuavaの目的ではありません。グアバの'ImmutableMap'はハッシングに基づいており、クエリスピードの大幅な値上げなしには効率的な更新をサポートしません。 –

+0

言い換え:Guavaの不変なコレクションは、高速なクエリ/反復と最小限のメモリ消費のために構築されています。これは、ハッシュと配列を意味し、効率的な非破壊更新をサポートすることはできません。 –

答えて

6

午前ビット予期しないmap of Functional Javaはグアバのように可変です。私が期待する通り、リストは不変です。

"永続的なコレクションJava"のためのグーグル:pcollections。 Map implementationがあります。

実際に他の実装を使用する前に、Guavaに対するメモリとパフォーマンスの特性をベンチマークします。まだそれが良いのであれば私は驚かないだろう。

関連する問題