📜  Java Guava中的MultiMap

📅  最后修改于: 2022-05-13 01:55:45.574000             🧑  作者: Mango

Java Guava中的MultiMap

简介: Multimap 是一种将键与任意多个值相关联的通用方法。 Guava 的 Multimap 框架可以轻松处理从键到多个值的映射。有两种方法可以从概念上考虑 Multimap:
1)作为从单个键到单个值的映射的集合。

a -> 1
a -> 2
a -> 4
b -> 3
c -> 5

2)作为从唯一键到值集合的映射。

a -> [1, 2, 4]
b -> [3]
c -> [5] 

声明: com.google.common.collect.Multimap< K,V >接口的声明如下:

@GwtCompatible
public interface Multimap

下面给出的是 Guava 的 Multimap Interface 提供的一些方法的列表:

视图: Multimap 还支持许多强大的视图。 multimap API 的大部分功能来自它提供的视图集合。这些总是反映多图本身的最新状态

  • asMap将任何 Multimap< K, V > 视为 Map< K, Collection< V >> >。返回的map支持remove,对返回的collection的修改可以直写,但是map不支持put或者putAll。
  • entry查看 Multimap 中所有条目的 Collection< Map.Entry< K, V >> 。 (对于 SetMultimap,这是一个 Set。)
  • keySet将 Multimap 中的不同键视为一个集合。
  • keys将 Multimap 的键视为 Multiset,多重性等于与该键关联的值的数量。元素可以从 Multiset 中删除,但不能添加,更改将写入。
  • values()将 Multimap 中的所有值视为一个“扁平化”集合< V >,全部作为一个集合。这类似于 Iterables.concat(multimap.asMap().values()),但返回的是一个完整的 Collection。

Guava 的 Multimap 接口提供的其他一些方法是:

Multimap V/s Map: Multimap< K, V > 不是 Map< K, Collection< V > >,尽管这样的映射可能在 Multimap 实现中使用。下面给出了差异:

  • Multimap.get(key)总是返回一个非 null 的,可能是空的集合。这并不意味着 multimap 会花费与键关联的任何内存,而是返回的集合是一个视图,允许您根据需要添加与键的关联。
  • 如果您更喜欢为不在 multimap 中的键返回 null 的更类似于 Map 的行为,请使用asMap()视图获取 Map< K, Collection< V > >。
  • Multimap.containsKey(key)当且仅当存在与指定键关联的任何元素时才为真。特别是,如果一个键 k 先前与一个或多个值相关联,而这些值已经从 multimap 中删除,则 Multimap.containsKey(k) 将返回 false。
  • Multimap.entries()返回 Multimap 中所有键的所有条目。如果您想要所有密钥集合条目,请使用 asMap().entrySet()。
  • Multimap.size()返回整个多图中的条目数,而不是不同键的数量。改为使用 Multimap.keySet().size() 来获取不同键的数量。

实现: Multimap 提供了多种实现。您可以在大多数使用Map< K, Collection< V >>的地方使用它。

优点:多图通常用于 Map< K, Collection< V >>本来会出现的地方。

  • 在使用 put() 添加条目之前,无需填充空集合。
  • get() 方法从不返回 null,只返回一个空集合(我们不需要像在Map< String, Collection< V > >测试用例中那样检查 null)。
  • 当且仅当一个键映射到至少一个值时,它才包含在 Multimap 中。任何导致键的关联值为零的操作都会产生从 Multimap 中移除该键的效果。
  • 总条目值计数可用作 size()。

参考 :
谷歌番石榴