我们熟悉的map映射操作一般是这样的。
a: [A, B, C]
b: [D]
a: [A, B, C]
b: [D]
Map<String, String> map = new HashMap<>();
map.put("a", "A");
map.put("a", "B");
map.put("a", "C");
map.put("c", "D");
for(String key : map.keySet()){
System.out.println(map.get(key));
}
我们想将ABC都用"a"来映射,当时 结果却不是我们想要的
输出结果:
C
D
很显然 "a" 做键的前两次put都被最后一次覆盖掉了,即HashMap多次使用同一个对象做键的话,前面的将会被覆盖。幸运的是Guava 提供了很多实现了MultiMap<K,V>接口的类可以实现一个对象映射多个值。这里我只演示两个常用的。ListMultimap<K,V>、ArrayListMultimap<K,V> 和HashMultiMap<K,V> 这三个都实现了Multimap<K,V>,并且ArrayListMultimap<K,V>继承了ListMultimap<K,V>
public class Test {
public static void main(String[] args) {
ListMultimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("a", "A");
multimap.put("a", "B");
multimap.put("a", "C");
multimap.put("b", "D");
for (String firstName : multimap.keySet()) {
List<String> lastNames = multimap.get(firstName);//注意获取的values是一个List
System.out.println(firstName + ": " + lastNames);
}
HashMultimap<String, String> map = HashMultimap.create();
map.put("a", "A");
map.put("a", "B");
map.put("a", "C");
map.put("b", "D");
for(String key : map.keySet()){
Set<String> sets = map.get(key);//注意获取的values是一个Set
System.out.println(key + ": "+sets);
}
}
}
输出结果:
a: [A, B, C]
b: [D]
a: [A, B, C]
b: [D]
Guava 也提供了MultiSet<K>接口,实现这个几口的数据结构在保留set的其他功能基础上。能够存储多个相同的元素。平常我们使用的例如HashSet是不能存放多个相同元素的,即使多次add也只会保留一个。
此外 Guava 还提供了一个 MultiMaps类来辅助Multimap<K,V>的使用,使得Multimap<K,V>像Map一样方便开发者使用
这里列出几个我觉得比较使用的方法:
static <K,V> Multimap<K,V> | synchronizedMultimap(Multimap<K,V> multimap)
Returns a synchronized (thread-safe) multimap backed by the specified multimap.
|
static <K,V> ListMultimap<K,V> | synchronizedListMultimap(ListMultimap<K,V> multimap)
Returns a synchronized (thread-safe)
ListMultimap backed by the specified multimap.
|
static <K,V> Map<K,List<V>> | asMap(ListMultimap<K,V> multimap)
|
static <K,V> Map<K,Collection<V>> | asMap(Multimap<K,V> multimap)
Returns
multimap.asMap() .
|
static <K,V> ListMultimap<K,V> | filterKeys(ListMultimap<K,V> unfiltered,Predicate<? super K> keyPredicate)
Returns a multimap containing the mappings in
unfiltered whose keys satisfy a predicate
|
static <K,V> Multimap<K,V> | filterKeys(Multimap<K,V> unfiltered,Predicate<? super K> keyPredicate)
Returns a multimap containing the mappings in
unfiltered whose keys satisfy a predicate.
|
static <K,V> Multimap<K,V> | filterValues(Multimap<K,V> unfiltered,Predicate<? super V> valuePredicate)
Returns a multimap containing the mappings in
unfiltered whose values satisfy a predicate.
|