Руководство по Guava Multimap
1. обзор
В этой статье мы рассмотрим одну из реализацийMap из библиотеки Google Guava -Multimap. Это коллекция, которая отображает ключи в значения, аналогичноjava.util.Map, но в которой каждый ключ может быть связан с несколькими значениями.
2. Maven Dependency
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 тогда и только тогда, когда он отображается как минимум на одно значение. Любая операция, которая приводит к тому, что ключ имеет нулевые связанные значения, имеет эффект удаления этого ключа изMultimap (вMap<String, Collection<V>>,, даже если мы удалим все значения из коллекции, мы все равно сохраним пустойCollection как значение, и это ненужные накладные расходы памяти)
-
Общее количество вводимых значений доступно какsize()
6. Заключение
В этой статье показано, как и когда использовать GuavaMultimap.. Он сравнивает его со стандартнымjava.util.Map и показывает плюсы GuavaMultimap..
Все эти примеры и фрагменты кода можно найти вGitHub project - это проект Maven, поэтому его должно быть легко импортировать и запускать как есть.