Guava – MultiMap
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接口提供的一些方法列表:
视图:Multimap还支持一些强大的视图。Multimap API的大部分功能来自于它提供的视图集合。这些集合总是反映出multimap本身的最新状态.
- asMap:将任何Multimap<K, V>视为
<K, Collection<V>>
。返回的地图支持删除,并且对返回的集合的改变是通过写的,但是地图不支持put或putAll - entries:将MultiMap中的不同键作为一个集合。
<Map.Entry<K, V>>
将MultiMap的键视为一个多集,其倍数等于与该键相关的值的数量。元素可以从Multiset中移除,但不能添加,更改将被写入。 - keySet:将多图中的不同键视为一个集合
- keys:将Multimap的键视为一个Multiset,其倍数等于与该键相关的值的数量。元素可以从Multiset中移除,但不能添加,变化将通过以下方式写入.
- values():将Multimap中的所有值看作是一个 “扁平化 “的Collection<V>,全部作为一个集合。这类似于Iterables.concat(multimap.asMap().values()),但返回一个完整的集合,而不是.
下面是Guava的MultiMap接口提供的一些方法列表:
Multimap 与 Map比较 : Multimap<K, V>不是 Map<K, Collection<V>
,尽管在Multimap的实现中可能会用到这样的地图。下面给出的是两者的区别:
- Multimap.get(key) 总是返回一个非空的,可能是空的集合。这并不意味着multimap会花费任何与键相关的内存,相反,返回的集合是一个视图,如果你愿意,可以添加与键的关联.
- 如果你喜欢更类似于Map的行为,即对不在多图中的键返回null,可以使用asMap()视图来获得一个
Map<K, Collection<V>
- Multimap.containsKey(key) 是真的,当且仅当有任何元素与指定的键相关联。特别是,如果一个键k以前与一个或多个值相关联,而这些值后来被从多图中删除,Multimap.containsKey(k)将返回false.
- Multimap.entries() 返回Multimap中所有键的所有条目。如果你想要所有的键集合条目,请使用asMap().entrySet().
- Multimap.size() 返回整个multimap中的条目数,而不是独立键的数量。使用Multimap.keySet().size()来获取独立键的数量.
实现: Multimap提供了多种多样的实现方式。你可以在大多数你会使用Map<K, Collection<V>
的地方使用它.
优点: Multimaps通常被用在 Map<K, Collection<V>
会出现的地方.
- 在用put()添加一个条目之前,不需要填充一个空的集合.
- get()方法从不返回null,只返回一个空的集合(我们不需要像
Map<String, Collection<V>
测试案例中那样检查null). - 当且仅当一个键映射到至少一个值时,它才被包含在Multimap中。任何导致一个键的相关值为零的操作,都会产生从Multimap中删除该键的效果.
- 总的条目值计数可通过size()获得.