2012-02-01 12 views
13

"modifiye" ama onların haritaları kolayca ufak değişikliklerle yeni haritalar oluşturmak için yöntemler olmadığını bulmak için sürpriz oldu. Bunun üzerine, oluşturucuları anahtarlara yeni değerler atamanıza veya anahtarları kaldırmaya izin vermiyor.Verimli Şu anda onun değişmez koleksiyonları için Guava kullandığınız bir 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 */ 
:

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

o Guava benziyor yapmamı bekliyoruz ne:

Yani sadece tek bir değer değiştirmek istiyorsa, işte yapabilmek istiyorum ne

Bunu yaparak haritanın yeni bir kopyasını istiyorum. Orijinal kopya el değmemiş ve ben şeyleri geri koymak için atomik bir referans kullanacağım, böylece tüm kurulum iş parçacığı için güvenli.

Sadece yavaş. Burada yorganın altında oluyor boşa kopyalama çok şey var

. Haritada 1,024 kova olduğunu varsayalım. Bu immutable kovaları olduğu gibi kullanabildiğiniz ve bunlardan sadece birini kestirdiğinizde, gereksiz yere yeniden yarattığınız 1.023 kova.

Yani sanırım:

  1. şey bu tür bir yere gömülü bir Guava yarar bir yöntem var mı? (Bu Maps veya ImmutableMap.Builder üzerinde değildir.) Bu tarz şeyleri doğru olur başka bir Java kütüphanesi

  2. var mı? ... map of Functional Java Guava en gibi değişebilirdir

+0

bir özellik isteği başvurusunda bulunun ama muhtemelen gerçekten doğru fonksiyonel veri yapıları bir kütüphane arıyoruz. –

+0

Yep. Bu yapılabilecek bir şey - bu, işlevsel dillerin yaptığı şey - ama Guava'nın orada olmadığı şey bu değil. Guava'nın ör. "ImmutableMap" hashing dayanmaktadır ve bu, sorgu hızındaki önemli bir fiyattan değil, verimli güncellemeyi desteklemeyecektir. –

+0

Rephrase: Guava'nın değişmez koleksiyonları hızlı sorgu/yineleme ve minimum bellek tüketimi için üretilmiştir. Bu, tahribatsız ve etkili olmayan güncellemeleri desteklemenize izin vermeyecek olan karma ve diziler anlamına gelir. –

cevap

6

Biraz beklenmedik ben Clojure başlık altında bu tür bir şey vardır izlenimi altında değilim ancak henüz diller arasında geçiş hazır değiliz. Beklediğim gibi liste değişmez. pcollections: sunulmuş, "kalıcı koleksiyon java" Googling

. Map implementation var. Aslında kriter Guava karşı bellek ve performans özellikleri başka herhangi uygulanmasını kullanmadan önce

. Hala daha iyi olursa şaşırmam. İstersen