Guide to Guava Multimap – Guava Multimap指南

最后修改: 2017年 1月 17日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

In this article, we will look at one of Map implementations from Google Guava library – Multimap. It is a collection that maps keys to values, similar to java.util.Map, but in which each key may be associated with multiple values.

在这篇文章中,我们将看看Google Guava库中的一个Map实现 – Multimap。它是一个将键映射到值的集合,类似于java.util.Map,但其中每个键可以与多个值相关联。

2. Maven Dependency

2.Maven的依赖性

First, let’s add a dependency:

首先,让我们添加一个依赖关系。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

The latest version can be found here.

最新版本可以在这里找到。

3. Multimap Implementation

3.Multimap的实施

In the case of Guava Multimap, if we add two values for the same key, the second value will not override the first value. Instead, we will have two values in the resulting map. Let’s look at a test case:

在Guava Multimap的情况下,如果我们为同一个键添加两个值,第二个值将不会覆盖第一个值。相反,我们将在生成的map中拥有两个值。让我们看看一个测试案例。

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

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

assertEquals(2, map.size());

Printing the map‘s content will output:

打印map的内容会输出。

{a-key=[firstValue, secondValue]}

When we will get values by key “a-key” we will get Collection<String> that contains “firstValue” and “secondValue” as a result:

当我们通过键 “a-key “获取数值时,我们将得到Collection<String> ,其中包含 “firstValue “和 “secondValue “作为结果。

Collection<String> values = map.get(key);

Printing values will output:

打印值会输出。

[firstValue, secondValue]

4. Compared to the Standard Map

4.与标准地图相比

Standard map from java.util package doesn’t give us the ability to assign multiple values to the same key. Let’s consider a simple case when we put() two values into a Map using the same key:

来自java.util包的标准map并没有给我们为同一个键分配多个值的能力。让我们考虑一个简单的案例,当我们使用同一个键向Mapput()两个值。

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

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

assertEquals(1, map.size());

The resulting map has only one element (“secondValue”), because of a second put() operation that overrides the first value. Should we want to achieve the same behavior as with Guava’s Multimap, we would need to create a Map that has a List<String> as a value type:

结果map只有一个元素(“secondValue”),因为第二个put() 操作覆盖了第一个值。如果我们想实现与Guava的Multimap相同的行为,我们需要创建一个Map,它有一个List<String> 作为一个值类型。

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

List<String> values = map.get(key);
if(values == null) {
    values = new LinkedList<>();
    values.add("firstValue");
    values.add("secondValue");
 }

map.put(key, values);

assertEquals(1, map.size());

Obviously, it is not very convenient to use. And if we have such need in our code then Guava’s Multimap could be a better choice than java.util.Map.

很明显,它的使用并不是很方便。如果我们的代码中有这样的需求,那么Guava的Multimap可能是比java.util.Map.更好的选择。

One thing to notice here is that, although we have a list that has two elements in it, size() method returns 1. In Multimap, size() returns an actual number of values stored in a Map, but keySet().size() returns the number of distinct keys.

这里需要注意的一点是,尽管我们有一个有两个元素的列表,size()方法却返回1。在Multimap中,size()返回存储在Map中的实际数值,keySet().size()返回独立键的数量。

5. Pros of Multimap

5.Multimap的优点

Multimaps are commonly used in places where a Map<K, Collection<V>> would otherwise have appeared. The differences include:

多图常用于本来会出现Map<K, Collection<V>>/em>的地方。这些区别包括

  • There is no need to populate an empty collection before adding an entry with put()
  • The get() method never returns null, only an empty collection (we do not need to check against null like in Map<String, Collection<V>> test case)
  • A key is contained in the Multimap if and only if it maps to at least one value. Any operation that causes a key to has zero associated values, has the effect of removing that key from the Multimap (in Map<String, Collection<V>>, even if we remove all values from the collection, we still keep an empty Collection as a value, and this is unnecessary memory overhead)
  • The total entry values count is available as size()

6. Conclusion

6.结论

This article shows how and when to use Guava Multimap. It compares it to standard java.util.Map and shows pros of Guava Multimap.

本文展示了如何以及何时使用Guava的Multimap.,它将其与标准的java.util.Map进行了比较,并展示了GuavaMultimap.的优点。

All these examples and code snippets can be found in the GitHub project – this is a Maven project, so it should be easy to import and run as it is.

所有这些例子和代码片段都可以在GitHub项目中找到–这是一个Maven项目,所以应该很容易导入并按原样运行。