Guava предоставляет нам отличные фабричные методы для типов Java, таких как Maps.newHashMap()
.
Но есть ли еще конструкторы для java Maps?
HashMap<String,Integer> m = Maps.BuildHashMap.
put("a",1).
put("b",2).
build();
java
collections
guava
Элазар Лейбович
источник
источник
Ответы:
Поскольку
Map
интерфейс Java 9 содержит:Map.of(k1,v1, k2,v2, ..)
Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ..)
.Ограничения этих фабричных методов заключаются в том, что они:
null
s в качестве ключей и / или значений (если вам нужно хранить нули, посмотрите другие ответы)Если нам нужна изменяемая карта (например, HashMap), мы можем использовать ее конструктор копирования и позволить ему копировать содержимое карты, созданной с помощью
Map.of(..)
источник
null
значений, что может быть проблемой в зависимости от варианта использования.Map.of(k1,v1, k2,v2, ...)
можно безопасно использовать, когда у нас мало ценностей. Для большего количества значенийMap.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)
дает нам более читаемый код, который менее подвержен ошибкам (если я вас неправильно понял).Для HashMaps такого нет, но вы можете создать ImmutableMap с помощью конструктора:
А если вам нужна изменяемая карта, вы можете просто передать ее конструктору HashMap.
источник
ImmutableMap
не поддерживаетnull
ценности. Таким образом, у этого подхода есть ограничение: вы не можете устанавливать значения в своемHashMap
tonull
.new HashMap
конструктора Java вместо статическогоMaps.newHashMap
метода?Не совсем строитель, но использующий инициализатор:
источник
map instanceof HashMap
ложью? Похоже, не очень хорошая идея.map.getClass()==HashMap.class
вернет false. Но в любом случае это глупый тест.HashMap.class.isInstance(map)
должно быть предпочтительным, и это вернет истину.Это похоже на принятый ответ, но, на мой взгляд, немного чище:
Существует несколько вариантов вышеупомянутого метода, и они отлично подходят для создания статических, неизменных, неизменяемых карт.
источник
Вот очень простой ...
затем
См. Https://gist.github.com/culmat/a3bcc646fa4401641ac6eb01f3719065
источник
Простой конструктор карт легко написать:
источник
Ты можешь использовать:
Это не так стильно и читабельно, но работает.
источник
Map<String, Integer> map = ImmutableMap.of("a", 1, "b", 2);
, лучше?HashMap
изменчив; в строителе нет необходимости.источник
ImmutableSet
. Если вы действительно хотите, чтобы он был изменяемым, вы можете инициализировать его в конструкторе, блоке инициализатора экземпляра или блоке статического инициализатора, если это статическое поле.ImmutableMap
очевидно , должен был сказать там.{{init();}}
(не в конструктор, поскольку другой конструктор может это забыть). И приятно, что это своего рода атомное действие. Если карта изменчива, то инициализация ее с помощью построителя гарантирует, что она всегда либоnull
в конечном состоянии, либо в конечном состоянии, а не наполовину.Вы можете использовать свободный API в Eclipse Collections :
Вот блог с более подробной информацией и примерами.
Примечание: я являюсь приверженцем коллекций Eclipse.
источник
Некоторое время назад у меня было подобное требование. Это не имеет ничего общего с Guava, но вы можете сделать что-то подобное, чтобы иметь возможность аккуратно сконструировать,
Map
используя беглый строитель.Создайте базовый класс, расширяющий Map.
Затем создайте свободный конструктор с помощью методов, которые соответствуют вашим потребностям:
Затем вы можете реализовать это так:
источник
Это то, чего я всегда хотел, особенно при настройке тестовых приборов. Наконец, я решил написать собственный простой конструктор, который мог бы создавать любую реализацию карты - https://gist.github.com/samshu/b471f5a2925fa9d9b718795d8bbdfe42#file-mapbuilder-java
источник
Вот один, который я написал
Вы используете это так:
источник
Использование java 8:
Это подход Java-9
Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)
Как пользоваться:
источник
Есть
ImmutableMap.builder()
в Гуаве.источник
Underscore-java может создавать хэш-карту.
источник