Multimap类
像Map<String,List<Object>> map = new HashMap<String,List<Object>>这样的数据结构,自己实现起来太麻烦,你需要检查key是否村子,不存在使则创建一个,存在是在对应的List中添加一个。这个过程比较痛苦,如果你希望检查list中的对象是否存在、删除一个对象,或者遍历整个数据结构,那么需要更多的代码实现。
Mutimap
Guava的multimap就提供了一个方便地将一个键对应多个值的数结构,让我们可以简单优雅的实现上面复杂的数据结构,让我们的精力和实践放在业务逻辑上,而不是数据结构上。
public class MultiMapTest { @Test public void multiMapTest(){ Multimap<String, String> multimap = ArrayListMultimap.create(); multimap.put("key1", "this"); multimap.put("key1", "is"); multimap.put("key1", "key1List"); System.out.println("1."+multimap); assertEquals(3, multimap.size());
List<String> key2List = Lists.newArrayList("this", "is", "key2List"); multimap.putAll("key2", key2List); System.out.println("2."+multimap); assertEquals(6, multimap.size()); assertTrue(multimap.containsKey("key1")); assertTrue(multimap.containsValue("key2List")); Multiset<String> key1MultiSet = multimap.keys(); assertEquals(3, key1MultiSet.count("key1")); /*对keys返回的视图操作会影响multiMap*/ key1MultiSet.remove("key1"); System.out.println("4."+multimap); assertEquals(5, multimap.size()); /*对keySet返回的视图操作会影响multiMap*/ Set<String> keySet = multimap.keySet(); assertEquals(2, keySet.size()); keySet.remove("key1"); System.out.println("5."+multimap); multimap.remove("key2", "this"); System.out.println("6."+multimap); multimap.remove("key2","testDeleteNonExistValue");//如果key2对应的value的list中不存在"testDeleteNonExistValue"值,此语句也不报错 System.out.println("7."+multimap); assertEquals(2, multimap.size()); List<String> key3List = Lists.newArrayList("key3","is", "create"); multimap.putAll("key3", key3List); multimap.removeAll("key2"); System.out.println("8."+multimap); assertEquals(3, multimap.size()); key3List = Lists.newArrayList("new", "key3","has","been","created"); multimap.replaceValues("key3", key3List); System.out.println("9."+multimap); assertEquals(5, multimap.size()); /*key2不存在,新建key2*/ multimap.replaceValues("key2", key3List);//如果key2有对应的value则替换,如果没有则新加key2 System.out.println("10."+multimap); assertEquals(10, multimap.size()); List<String> valuesCollection = Lists.newArrayList(multimap.values()); /*对values返回的视图的操作不会影响multiMap*/ valuesCollection.removeAll(Lists.newArrayList("key3")); valuesCollection.add("addNew"); System.out.println("11."+multimap); assertEquals(10, multimap.size()); multimap.clear(); assertTrue(multimap.isEmpty()); } }
输出:
1.{key1=[this, is, key1List]}
2.{key1=[this, is, key1List], key2=[this, is, key2List]}
4.{key1=[is, key1List], key2=[this, is, key2List]}
5.{key2=[this, is, key2List]}
6.{key2=[is, key2List]}
7.{key2=[is, key2List]}
8.{key3=[key3, is, create]}
9.{key3=[new, key3, has, been, created]}
10.{key2=[new, key3, has, been, created], key3=[new, key3, has, been, created]}
11.{key2=[new, key3, has, been, created], key3=[new, key3, has, been, created]}
Multimap支持一些列强大的视图功能:
1.asMap把自身Multimap<K,V>映射成Map<K,Collection<V>>视图,这个Map视图支持remove和修改操作,但是不支持put和putAll。
当传入参数是不存在的key时,你希望返回的是null,而不是一个空的可修改的集合的时候就可以调用asMap().get(Key)。
2.entries视图能够将Multimap里所有的键值对以Collection<Map.Entry<K,V>>的形式展现。
Collection<Map.Entry<String,String>> multiEntitry = multimap.entries();
System.out.println("12."+multiEntitry);
输出: 12.[key2=new, key2=key3, key2=has, key2=been, key2=created, key3=new, key3=key3, key3=has, key3=been, key3=created]
3.Multimap.size()返回的是entries的数量,而不是不重复键的数量。如果要得到不重复键的数目就得用Multimap.keySet().size()。

浙公网安备 33010602011771号