Руководство по Guava Multimap

Руководство по Guava Multimap

1. обзор

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

2. Maven Dependency

Сначала добавим зависимость:


    com.google.guava
    guava
    21.0

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

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

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

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<String>, содержащий «firstValue» и «secondValue»:

Collection values = map.get(key);

При печати значения будут выводить:

[firstValue, secondValue]

4. По сравнению со СтандартнымMap

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

String key = "a-key";
Map map = new LinkedHashMap<>();

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

assertEquals(1, map.size());

Результирующийmap имеет только один элемент (“secondValue”), из-за второй операцииput(), которая отменяет первое значение. Если мы хотим добиться того же поведения, что и для GuavaMultimap,, нам нужно будет создатьMap сList<String> в качестве типа значения:

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 Guava может быть лучшим выбором, чемjava.util.Map.

Здесь следует отметить, что, хотя у нас есть список, состоящий из двух элементов, методsize() возвращает 1. ВMultimap, size() возвращается фактическое количество значений, хранящихся вMap,, ноkeySet().size() возвращает количество отдельных ключей.

5. ПлюсыMultimap

Multimaps обычно используются в местах, где в противном случае появился быMap<K, Collection<V>>. Различия включают в себя:

  • Нет необходимости заполнять пустую коллекцию перед добавлением записи сput()

  • The get() method никогда не возвращаетnull, только пустую коллекцию (нам не нужно проверятьnull, как в тестовом примереMap<String, Collection<V>>)

  • Ключ содержится вMultimap тогда и только тогда, когда он отображается как минимум на одно значение. Любая операция, которая приводит к тому, что ключ имеет нулевые связанные значения, имеет эффект удаления этого ключа изMultimapMap<String, Collection<V>>,, даже если мы удалим все значения из коллекции, мы все равно сохраним пустойCollection как значение, и это ненужные накладные расходы памяти)

  • Общее количество вводимых значений доступно какsize()

6. Заключение

В этой статье показано, как и когда использовать GuavaMultimap.. Он сравнивает его со стандартнымjava.util.Map и показывает плюсы GuavaMultimap..

Все эти примеры и фрагменты кода можно найти вGitHub project - это проект Maven, поэтому его должно быть легко импортировать и запускать как есть.