Guava API學習之Multimap

      相信你們對Java中的Map類及其之類有大體的瞭解,Map類是以鍵值對的形式來存儲元素(Key->Value),可是熟悉Map的人都知 道,Map中存儲的Key是惟一的。什麼意思呢?就是假如咱們有兩個key相同,但value不一樣的元素須要插入到map中去,那麼先前的key對應的 value將會被後來的值替換掉。若是咱們須要用Map來把相同key的值存在一塊兒,代碼看起來像下面同樣:函數

 

    @Test  
    public void test1(){  
            List<Person> personList = new ArrayList<Person>();  
            Person person = new Person("孫剛1", "21", "男");  
            Person person2 = new Person("孫剛2", "21", "男");  
            Person person3 = new Person("孫剛3", "21", "女");  
            Person person4 = new Person("孫剛4", "21", "男");  
            Person person5 = new Person("孫剛5", "21", "女");  
            Person person6 = new Person("孫剛6", "21", "男");  
              
            personList.add(person);  
            personList.add(person2);  
            personList.add(person3);  
            personList.add(person4);  
            personList.add(person5);  
            personList.add(person6);  
              
            genderStatistics(personList);  
    }  
      
    //性別統計    
        public void genderStatistics(List<Person> personList){  
            Optional<List<Person>> optionalForPerson= Optional.fromNullable(personList);  
            if (!optionalForPerson.isPresent()) {  
                return;  
            }  
              
            Map<String, List<Person>> map = new HashMap<String, List<Person>>();  
            for (Person person : personList) {  
                String sex = person.getSex();  
                List<Person> persons = map.get(sex);  
                if (null == persons) {//第一次加入  
                    persons = new ArrayList<Person>();  
                }  
                  
                persons.add(person);  
                map.put(sex, persons);  
            }  
              
            for(Entry<String, List<Person>> entry : map.entrySet()){  
                String key = entry.getKey();  
                System.out.println(key + ":" + entry.getValue());    
            }  
        }  

結果以下:google

    女:[Person [name=孫剛3, age=21, sex=女], Person [name=孫剛5, age=21, sex=女]]  
    男:[Person [name=孫剛1, age=21, sex=男], Person [name=孫剛2, age=21, sex=男], Person [name=孫剛4, age=21, sex=男], Person [name=孫剛6, age=21, sex=男]]  

 

雖然實現了功能,可是代碼比較長,可是若是你用Guava去實現一樣的功能,你會發現你的代碼一會兒變少了。Guava提供了下面的結構spa

mport com.google.common.collect.ArrayListMultimap;   
import com.google.common.collect.Multimap;    
  
Multimap<K, V> myMultimap = ArrayListMultimap.create();  

      從名字能夠看出,Multimap能夠存放的key值是不惟一的,Multimap並無實現 Map 的接口,因此不須要達到鍵惟一的要求。若是存放了key同樣的元素,Multimap並不會覆蓋之前相同的key元素,而是加進去了。結果有點像{k1= [v1, v2, v3], k2=[v7, v8],….}其中v1, v2, v3對應的key都是k1,而若是是Map,則它的結果有點像{k1=v1, k2=v2,…}看到區別了吧?那麼,用Multimap實現上面一樣的功能代碼有點像code

    Multimap<String, Person> myMultimap = ArrayListMultimap.create();   
    for (Person person : personList) {    
          String sex = person.getSex();    
          myMultimap.put(sex, person);    
    }    
      
      
      
    Map<String, Collection<Person>> map1 = myMultimap.asMap();    
    for (Entry<String, Collection<Person>> entry : map1.entrySet()) {    
        String key = entry.getKey();    
        System.out.println(key + "\t" + entry.getValue());    
    }    

看到了吧,代碼簡單多了吧!這裏有一點你可能會疑惑,就是爲什麼get方法返回的是一個Collection而不是list,這是由於前者會更加有用。若是 你須要基於multimap直接操做list或者set,那麼能夠在定義類型的時候使用子類名稱:ListMultimap,SetMultimap和 SortedSetMultimap。例如:blog

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

這裏須要再次強調的是,Multimap不是Map(Multimap Is Not A Map)!接口

 

一 個Multimap<K, V>不是一個Map<K, Collection<V>>, 雖然咱們能夠利用Map<K, Collection<V>>來實現Multimap<K, V>,即便如此,它們之間仍是有區別的:v8

 

 

  1. Multimap.get(key) 老是返回一個unll值(多是一個空的collection);
  2. 可 以利用asMap()方法來獲得一個 Map<K, Collection<V>>類型的數據(或者利用ListMultimap中的靜態方法Multimaps.asMap()獲得一個 Map<K, List<V>類型的數據; SetMultimap和SortedSetMultimap也相似);
  3. Multimap.containsKey(key)只有在這個key和一個或者多個元素相關聯的時候纔會返回true,若是這個key在刪除以前和一個或者多個元素相關聯則函數將會返回false;
  4. Multimap.entries()返回Multimap全部實體的全部key值;
  5. Multimap.size()返回在Multimap中存放的全部實體的數量,而不是不一樣keys的數量。咱們能夠利用Multimap.keySet().size()獲得Multimap中全部不一樣keys的數量。
相關文章
相關標籤/搜索