Java 8 Multimap

17 Mar 2025 | 5 分钟阅读

Java 提供了各种有用的内置集合库。但有时我们需要 Java 标准库中没有的特殊类型的集合。其中一种集合就是 Multimap。在本节中,我们将学习什么是 multimap,以及 如何在 Java 中实现 multimap,还有 Guava 库的 Multimap 接口

Java Multimap

在 Java 中,Map 是一种允许我们将键映射到值的 数据结构。另一方面,multimap 是 Guava 库中一种新的集合类型,它允许将单个键映射到多个值(类似于 DBMS 中的一对多关系)。但请注意,JDK 不支持 multimapping。

Java 8 Multimap

在 Java 中实现 multimap 的替代解决方案是使用 Google 的 Guava 库和 Apache Commons Collections 库。两者都提供了 Multimap 接口的实现。它可以存储一个键的多个值。键和值都存储在集合中,并被视为 Map<K, List<V>>Map<K, Set<V>>(标准 JDK 集合框架)的替代方案。

但是使用 Google Guava 库的 Multimap 对我们帮助不大。相反,我们将实现自己的 Multimap 类,该类也可以根据需要进行定制。在 Java 中编写 Multimap 类很容易。

以下 Java 程序展示了如何使用 Map 和 Collection 在 Java 中实现 Multimap 类。

Java Multimap 实现

MultimapExample.java

输出

----- Printing Multimap using keySet -----

a: [Andrew]
b: [Albert, Tom]
d: [Sam, Reo]
g: [Jack, David]

使用 Google Guava 库

Multimap<K, V> 接口定义在 Guava 库的 com.google.common.collect 包中。它实现了许多类,例如:

ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, LinkedListMultimap, TreeMultimap。

语法

一个集合,它像 Map 一样将键映射到值,但每个键可能与多个值相关联。我们可以将 multimap 的内容可视化为从键到非空值集合的映射。例如:

  • X → 1, 2
  • Y → 3

  • X → 1
  • X → 2
  • Y → 3

Java Multimap 接口方法

方法描述
asMap()它以 Map 的形式返回此 multimap 的视图,其中每个不同的键都映射到该键关联值的非空集合。
clear()它会从 multimap 中移除所有键值对,使其变为空。
containsEntry(Object key, Object value)如果此 multimap 包含至少一个具有指定键和值的键值对,则返回 true。
containsKey(Object key)如果此 multimap 包含至少一个具有指定键的键值对,则返回 true。
containsValue(Object value)如果此 multimap 包含至少一个具有指定值的键值对,则返回 true。
entries()它以 Map.Entry 实例的形式返回此 multimap 中所有键值对的视图集合。
equals(Object obj)它将指定的对象与此 multimap 进行相等性比较。
forEach(BiConsumer<? super K,? super V> action)它会对此 multimap 中包含的所有键值对执行给定的操作。
get(K key)如果存在,则返回此 multimap 中与指定键关联的值的视图集合。
hashCode()它返回此 multimap 的哈希码。
isEmpty()如果此 multimap 不包含任何键值对,则返回 true。
keys()它返回一个包含此 multimap 中每个键值对的键的视图集合,而不合并重复项。
keySet()它返回此 multimap 中所有不重复键的视图集合。
put(K key, V value)将键值对存储在此 multimap 中。
putAll(K key, Iterable<? extends V> values)它将 values 中的每个值与相同的键 key 一起存储在此 multimap 中。
putAll(Multimap<? extends K,? extends V> multimap)它将 multimap 中的所有键值对存储在此 multimap 中,顺序与 multimap.entries() 返回的顺序相同。
remove(Object key, Object value)如果存在,则从 multimap 中移除具有指定键和值的单个键值对。
removeAll(Object key)它会移除与指定键关联的所有值。
replaceValues(K key, Iterable<? extends V> values)它将一个值集合与相同的键一起存储,替换该键已有的任何值。
size()它返回此 multimap 中的键值对的数量。
values()它返回一个包含此 multimap 中每个键值对的值的视图集合,而不合并重复项(因此 values().size() == size())。

下一主题Java 并行流