Рубрики
Без рубрики

Путеводитель по Гуаве Multimap

Краткое руководство по Guava Multimap в сравнении со стандартной картой java.util.Map

Автор оригинала: baeldung.

1. Обзор

В этой статье мы рассмотрим одну из реализаций Map из библиотеки Google Guava – Multimap . Это коллекция, которая сопоставляет ключи со значениями, аналогичными java.util.Карта , но в которой каждый ключ может быть связан с несколькими значениями.

2. Зависимость Maven

Во-первых, давайте добавим зависимость:


    com.google.guava
    guava
    29.0-jre

Последнюю версию можно найти здесь .

3. Реализация Multimap

В случае Guava Multimap, если мы добавим два значения для одного и того же ключа, второе значение не будет переопределять первое значение. Вместо этого у нас будет два значения в результирующей карте . Давайте рассмотрим тестовый случай:

String key = "a-key";
Multimap map = ArrayListMultimap.create();

map.put(key, "firstValue");
map.put(key, "secondValue");

assertEquals(2, map.size());

Печать содержимого map выведет:

{a-key=[firstValue, secondValue]}

Когда мы получим значения по ключу “a-key”, мы получим Collection , который содержит “FirstValue” и “secondValue” в результате:

Collection values = map.get(key);

Значения печати будут выведены:

[firstValue, secondValue]

4. По сравнению со стандартной картой

Стандартная карта из java.util package не дает нам возможности присваивать несколько значений одному и тому же ключу. Давайте рассмотрим простой случай, когда мы помещаем() два значения в Карту , используя один и тот же ключ:

String key = "a-key";
Map map = 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, поэтому его должно быть легко импортировать и запускать как есть.