инициализация 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 имеет максимальный размер четырех пар ключ, значение.

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

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

Ответы:


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

3
Нет. ImmutableMap.put устарел. Джон Скит использует ImmutableMap.Builder.put, именно так мы должны инициализировать карту с более чем 5 кортежами.
i2B
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.