Multimap

Multimap是guava中一个有用的工具类,下面我来介绍一下。

由来:
你是不是经常需要一个这样的数据结构:
Java代码  收藏代码

    Map<String,List<MyClass>> myClassListMap test2 
                                  = new HashMap<String,List<MyClass>>() 


自己实现太麻烦,你需要检查key是否存在,否则创建一个,最后代码成为这个样子:
Java代码  收藏代码

    void putMyObject(String key, Object value) { 
        List<Object> myClassList = myClassListMap.get(key); 
        if(myClassList == null) { 
            myClassList = new ArrayList<object>(); 
            myClassListMap.put(key,myClassList); 
        } 
        myClassList.add(value); 
    } 



比较痛苦,如果你希望检查List中的对象是否存在,删除一个对象,或者遍历整个数据结构,那么需要更多的代码。

guava来了:
Java代码  收藏代码

    Multimap<String,Object> myMultimap = ArrayListMultimap.create(); 



这里需要注意,所有的guava的集合都有create()方法,这个好处就是比较简单,你不用重复泛型信息了。

好了,开始使用Multimap了:
Java代码  收藏代码

    public class MutliMapTest { 
        public static void main(String... args) { 
      Multimap<String, String> myMultimap = ArrayListMultimap.create(); 
       
      // Adding some key/value 
      myMultimap.put("Fruits", "Bannana"); 
      myMultimap.put("Fruits", "Apple"); 
      myMultimap.put("Fruits", "Pear"); 
      myMultimap.put("Vegetables", "Carrot"); 
       
      // Getting the size 
      int size = myMultimap.size(); 
      System.out.println(size);  // 4 
       
      // Getting values 
      Collection<string> fruits = myMultimap.get("Fruits"); 
      System.out.println(fruits); // [Bannana, Apple, Pear] 
       
      Collection<string> vegetables = myMultimap.get("Vegetables"); 
      System.out.println(vegetables); // [Carrot] 
       
      // Iterating over entire Mutlimap 
      for(String value : myMultimap.values()) { 
       System.out.println(value); 
      } 
       
      // Removing a single value 
      myMultimap.remove("Fruits","Pear"); 
      System.out.println(myMultimap.get("Fruits")); // [Bannana, Pear] 
       
      // Remove all values for a key 
      myMultimap.removeAll("Fruits"); 
      System.out.println(myMultimap.get("Fruits")); // [] (Empty Collection!) 
    } 
    } 


这里有一点你可能会疑惑,就是为何get方法返回的是一个collection而不是list,这是因为前者会更加有用。如果你需要基于multimap直接操作list或者set,那么可以使用在定义类型的时候使用子类名称:ListMultimap,SetMultimap和SortedSetMultimap。例如:
Java代码  收藏代码

    ListMutlimap<String,String> myMutlimap = ArrayListMultimap.create(); 
     
    List<string> myValues = myMutlimap.get("myKey");  // Returns a List, not a Collection. 

你可能感兴趣的:(map)