inicjalizacja ImmutableMap Guava

140

Guava oferuje fajny skrót do inicjalizacji mapy. Jednak pojawia się następujący błąd kompilatora (Eclipse Indigo), gdy moja mapa inicjuje się do dziewięciu wpisów.

Metoda of(K, V, K, V, K, V, K, V, K, V)w typie ImmutableMapnie ma zastosowania do argumentów (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"
        );

Wydaje się, że wiadomość to mówi

ImmutableMap ma maksymalny rozmiar czterech par klucza, wartość.

Oczywiście nie może tak być, ale nie mogę dowiedzieć się, co zrobić, aby zwiększyć rozmiar mojego inicjatora.

Czy ktoś może mi powiedzieć, czego brakuje?

user903724
źródło

Odpowiedzi:

256

Zwróć uwagę, że Twój komunikat o błędzie zawiera tylko pięć K, Vpar, łącznie 10 argumentów. Jest to zgodne z projektem; Klasa ImmutableMap udostępnia sześć różnych of()metod, akceptujących od zera do pięciu par klucz-wartość. Nie ma of(...)przeciążenia akceptującego parametr varags, ponieważ Ki Vmogą mieć różne typy.

Chcesz 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();
Jon Skeet
źródło
Dzięki za szybkie odpowiedzi. Zdecydowałem się wypróbować Guava, ponieważ nie chciałem wpisywać wszystkich „puts” wymaganych przez standardowy inicjator map. Tyle na temat tego pomysłu!
user903724
7
@ user903724: Głównym powodem używania guawy tutaj jest silna niezmienność, IMO.
Jon Skeet
2
To lub nieznacznie zmniejszone zużycie pamięci - a składnia konstruktora jest dość płynna w miarę upływu czasu.
Louis Wasserman
2
cóż, możesz nadal mieć wiele wpisów, ale teraz używają one płynnego interfejsu API, więc nie ma potrzeby powtarzania myMapdla każdego.put
Kevin Welker
21
Zwróć też uwagę, jak przykładowy kod Jona może być a public static finali nadal działa, bez potrzeby stosowania metody pomocniczej ani static{}inicjatora!
Kevin Bourrillion,
62

jeśli mapa jest krótka, możesz:

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

Jeśli jest dłuższy, to:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();
Nathan Feger
źródło
9
Oprócz czytelności, możesz użyć ImmutableMap.ofstatycznej fabryki do pięciu kluczowych par wartości. Następnie musisz użyć kreatora.
Xaerxess
0

"put" jest przestarzałe , nie używaj go, zamiast tego użyj .of

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);
coda
źródło
3
Nie. ImmutableMap.put jest przestarzałe. Jon Skeet używa ImmutableMap.Builder.put, czyli dokładnie w jaki sposób powinniśmy zainicjować mapę z więcej niż 5 krotkami.
i2B