инициализация Guava ImmutableMap

143

Guava предлагает удобный ярлык для инициализации карты. Однако я получаю следующую ошибку компилятора (Eclipse Indigo), когда моя карта инициализируется до девяти записей.

Метод of(K, V, K, V, K, V, K, V, K, V)в типе ImmutableMapнеприменим для аргументов (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"
        );

Появляется сообщение о том, что

ImmutableMap имеет максимальный размер четырех пар ключ, значение.

Очевидно, этого не может быть, но я не могу понять, что делать, чтобы увеличить размер моего инициализатора.

Может кто подскажет, чего не хватает?

user903724
источник

Ответы:

262

Обратите внимание, что ваше сообщение об ошибке содержит только пять K, Vпар, всего 10 аргументов. Это сделано намеренно; класс ImmutableMap предоставляет шесть различных of()методов, принимающих от нуля до пяти пар "ключ-значение". Нет of(...)перегрузки, принимающей параметр varags, потому что Kи Vмогут быть разных типов.

Вы хотите 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();
Джон Скит
источник
Спасибо за быстрые ответы. Я решил попробовать Guava, потому что мне не хотелось вводить все «put», требуемые стандартным инициализатором карты. Вот вам и идея!
user903724
7
@ user903724: Основная причина использования Guava здесь - сильная неизменяемость, ИМО.
Джон Скит,
2
Это или немного уменьшенное потребление памяти - и синтаксис компоновщика довольно плавный.
Луи Вассерман
2
ну, у вас может быть еще несколько пут, но теперь они используют свободный API, поэтому не нужно повторять myMapдля каждого.put
Кевин Велкер
21
Также обратите внимание, как пример кода Джона может быть, public static finalи он по-прежнему работает, нет необходимости в вспомогательном методе или static{}инициализаторе!
Кевин Бурриллион,
63

если карта короткая, вы можете:

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

Если длиннее, то:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();
Натан Фегер
источник
9
Помимо удобочитаемости, вы можете использовать ImmutableMap.ofстатическую фабрику для пяти пар ключ-значение. Тогда вам нужно использовать строитель.
Xaerxess
0

"put" устарел , воздержитесь от его использования, используйте вместо него .of

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);
coda
источник
3
Нет. ImmutableMap.put устарел. Джон Скит использует ImmutableMap.Builder.put, именно так мы должны инициализировать карту с более чем 5 кортежами.
i2B