bir Guava ImmutableMap başlatma


140

Guava, bir haritayı başlatmak için güzel bir kısayol sunuyor. Ancak haritam dokuz girişe başladığında aşağıdaki derleyici hatasını (Eclipse Indigo) alıyorum.

Yöntem of(K, V, K, V, K, V, K, V, K, V)türü ImmutableMapbağımsız değişkenler için geçerli değildir (String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String)

ImmutableMap<String,String> myMap = ImmutableMap.of(
        "key1", "value1", 
        "key2", "value2", 
        "key3", "value3", 
        "key4", "value4", 
        "key5", "value5", 
        "key6", "value6", 
        "key7", "value7", 
        "key8", "value8", 
        "key9", "value9"
        );

Mesaj şöyle diyor

Bir ImmutableMap en fazla dört çift anahtar / değer çiftine sahiptir.

Açıkçası, durum böyle olamaz ama başlatıcımın boyutunu artırmak için ne yapacağımı anlayamıyorum.

Biri bana neyin eksik olduğunu söyleyebilir mi?

Yanıtlar:


256

Hata mesajınızın yalnızca beş K, Vçift, toplam 10 bağımsız değişken içerdiğine dikkat edin . Bu tasarım gereğidir; ImmutableMap sınıfı, of()sıfır ve beş anahtar / değer çifti eşleştirmesini kabul eden altı farklı yöntem sağlar . Bir yoktur of(...)bir nedeni parametre varags kabul aşırı yük Kve Vfarklı türlerde olabilir.

Şunu istersiniz ImmutableMap.Builder:

ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder()
    .put("key1", "value1") 
    .put("key2", "value2") 
    .put("key3", "value3") 
    .put("key4", "value4") 
    .put("key5", "value5") 
    .put("key6", "value6") 
    .put("key7", "value7") 
    .put("key8", "value8") 
    .put("key9", "value9")
    .build();

Hızlı cevaplar için teşekkürler. Guava'yı denemeye karar verdim, çünkü standart bir harita başlatıcısının gerektirdiği tüm 'koyarları' yazmak istemedim. Bu fikir için çok fazla!
user903724

7
@ user903724: Burada Guava'yı kullanmanın ana nedeni güçlü değişmezlik, IMO.
Jon Skeet

2
Bu ya da biraz azaltılmış bellek tüketimi - ve yapıcı sözdizimi işler akıcı bir şekilde akıcı.
Louis Wasserman

2
Peki, hala birden fazla koymanız olabilir, ancak şimdi akıcı API kullanıyorlar, bu yüzden myMapher biri için tekrarlamanıza gerek yok.put
Kevin Welker

21
Jon'un örnek kodunun nasıl olabileceğine public static finalve hala çalıştığına, yardımcı bir yönteme veya static{}başlatıcıya gerek olmadığına da dikkat edin !
Kevin Bourrillion

62

harita kısaysa şunları yapabilirsiniz:

ImmutableMap.of(key, value, key2, value2); // ...up to five k-v pairs

Daha uzunsa:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();

9
Okunabilirlik dışında, ImmutableMap.ofbeş anahtar değer çifti için statik fabrika kullanabilirsiniz . O zaman kurucu kullanmalısınız.
Xaerxess

0

"put" kullanımdan kaldırıldı , kullanmaktan kaçının, bunun yerine .of kullanın

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);

3
Hayır. ImmutableMap.put kullanımdan kaldırıldı. Jon Skeet, ImmutableMap.Builder.put kullanıyor, tam olarak 5'ten fazla tuple ile bir harita başlatmamız gerekiyor.
i2B
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.