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?

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();

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();

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"
);

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.