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


140

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 має максимальний розмір із чотирьох пар ключових значень.

Очевидно, це не може бути, але я не можу зрозуміти, що робити для збільшення розміру мого ініціалізатора.

Може хтось скаже мені, чого не вистачає?

Відповіді:


256

Зауважте, що ваше повідомлення про помилку містить лише п’ять 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, тому що мені не хотілося вводити всі "ставки", необхідні стандартним ініціалізатором карт. Стільки за цю ідею!
користувач903724

7
@ user903724: Основна причина використання тут Guava - сильна незмінність, IMO.
Джон Скіт

2
Це, або дещо зменшене споживання пам’яті - і синтаксис будівельника досить вільно, як ідуть справи.
Луї Вассерман

2
ну, можливо, у вас ще є кілька ставок, але вони зараз використовують вільний API, тому не потрібно повторювати myMapдля кожного.put
Кевін Велкер,

21
Зверніть увагу також на те, як може бути прикладом коду Джона, public static finalі він як і раніше працює, немає необхідності в допоміжному методі чи static{}ініціалізаторі!
Кевін Бурліон

62

якщо карта коротка, ви можете зробити:

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

Якщо вона довша, то:

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

9
Крім читабельності, ви можете використовувати ImmutableMap.ofстатичну фабрику для до п'яти пар ключових значень. Тоді вам доведеться скористатися builder.
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.