1. Обзор
В этой статье мы рассмотрим одну из реализаций Map из библиотеки Google Guava – Multimap . Это коллекция, которая сопоставляет ключи со значениями, аналогичными java.util.Карта , но в которой каждый ключ может быть связан с несколькими значениями.
2. Зависимость Maven
Во-первых, давайте добавим зависимость:
com.google.guava guava 29.0-jre
Последнюю версию можно найти здесь .
3. Реализация Multimap
В случае Guava Multimap, если мы добавим два значения для одного и того же ключа, второе значение не будет переопределять первое значение. Вместо этого у нас будет два значения в результирующей карте . Давайте рассмотрим тестовый случай:
String key = "a-key"; Multimapmap = ArrayListMultimap.create(); map.put(key, "firstValue"); map.put(key, "secondValue"); assertEquals(2, map.size());
Печать содержимого map выведет:
{a-key=[firstValue, secondValue]}
Когда мы получим значения по ключу “a-key”, мы получим Collection , который содержит “FirstValue” и “secondValue” в результате:
Collectionvalues = map.get(key);
Значения печати будут выведены:
[firstValue, secondValue]
4. По сравнению со стандартной картой
Стандартная карта из java.util package не дает нам возможности присваивать несколько значений одному и тому же ключу. Давайте рассмотрим простой случай, когда мы помещаем() два значения в Карту , используя один и тот же ключ:
String key = "a-key"; Mapmap = new LinkedHashMap<>(); map.put(key, "firstValue"); map.put(key, "secondValue"); assertEquals(1, map.size());
Результирующая карта имеет только один элемент ( “второе значение”), из-за второй операции put () , которая переопределяет первое значение. Если мы хотим добиться того же поведения, что и с Multimap Гуавы, нам нужно будет создать Карту , которая имеет List в качестве типа значения:
String key = "a-key"; Map> map = new LinkedHashMap<>(); List values = map.get(key); if(values == null) { values = new LinkedList<>(); values.add("firstValue"); values.add("secondValue"); } map.put(key, values); assertEquals(1, map.size());
Очевидно, что он не очень удобен в использовании. И если у нас есть такая потребность в нашем коде, то Multimap Гуавы будет лучшим выбором, чем java.util.Map.
Здесь следует отметить, что, хотя у нас есть список, в котором есть два элемента, метод size() возвращает 1. В Multimap size() возвращает фактическое количество значений, хранящихся в карте, но keySet().size() возвращает количество различных ключей.
5. Плюсы Multimap
Мультикарты обычно используются в местах, где в противном случае появились бы Map Collection> . Различия включают в себя: Collection>
- Нет необходимости заполнять пустую коллекцию перед добавлением записи с помощью put()
- Метод get () никогда не возвращает null , только пустую коллекцию (нам не нужно проверять null , как в Map Collection> тестовый случай) Collection>
- тестовый случай) Ключ содержится в Multimap тогда и только тогда, когда он сопоставляется хотя бы с одним значением. Любая операция, которая приводит к тому, что ключ имеет нулевые связанные значения, приводит к удалению этого ключа из Multimap (в Map Collection>, даже если мы удалим все значения из коллекции, мы все равно сохраним пустую Коллекцию
- в качестве значения, и это ненужные затраты памяти) Collection>, даже если мы удалим все значения из коллекции, мы все равно сохраним пустую
6. Заключение
В этой статье показано, как и когда использовать Guava Multimap. Он сравнивает его со стандартным java.util.Карта и показывает плюсы гуавы Multimap.
Все эти примеры и фрагменты кода можно найти в проекте GitHub – это проект Maven, поэтому его должно быть легко импортировать и запускать как есть.