1. 程式人生 > >企業開發——google的Guava工具類

企業開發——google的Guava工具類

 1.Guava之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());    
            }  
        }  

結果如下:

    女:[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提供了下面的結構

import 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實現上面同樣的功能程式碼有點像

 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。例如:

    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>,即使如此,它們之間還是有區別的:

  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的數

相關推薦

Android開發-使用工具判斷網路的連線狀態

第一步 建立一個工具類NetWorks 在工具類中寫一個方法(getConne) 這個工具類裡可以寫很多方法 不僅僅限於判斷網路的連線狀態 比如常見的還有網路請求資料等等…在其他的頁面可以呼叫到這個工具類裡的方法 public class NetWorks { //判斷網路是否連線

Android應用開發------------Json工具(fastJson和Gson的兩種工具

json一般是Android中比較常用的與伺服器互動的資料形式。我們常用的架包來解析json字串有fastjson和gson 分別寫了兩個工具類: fastJson import java.util.ArrayList; import java.util.List;

java 微信開發 常用工具(xml傳輸和解析 json轉換物件)

與微信通訊常用工具(xml傳輸和解析) package com.lownsun.wechatOauth.utl; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; impo

最全Android開發常用工具

  主要介紹總結的Android開發中常用的工具類,大部分同樣適用於Java。        目前包括  HttpUtils、DownloadManagerPro、Safe.ijiami、ShellUtils、PackageUtils、 PreferencesUtils、

Android開發輔助工具 Utils 彙總

包括了各種工具類、輔助類、管理類等收集中國國內可用APIApache Commons Lang, a package of Java utility classes for the classes that are in java.lang’s hierarchy, or ar

java開發常用工具集合總結

1)java正則表示式的匹配包括:郵箱,手機,姓名,暱稱,身份證號,銀行卡號等; 2)生成6位隨機數; 3)對url中字串進行編碼和解碼 4)獲取客戶端ip地址 5)獲取系統當前時間 6)生成32位編碼不含橫線 7)生成MD5編碼 8)通過身份證獲

ssh開發常用工具

常用的泛型工具類: import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.

Android開發實用工具之資料校驗

package com.heliquan.test.util;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.GregorianCalendar;import

羊皮書APP(Android版)開發系列(十)Android開發常用工具

日期格式化工具 package cn.studyou.baselibrary.utils; import java.text.DecimalFormat; import java.text.ParseException; import java.text

企業開發——google的Guava工具

 1.Guava之MultiMap 相信大家對Java中的Map類及其之類有大致的瞭解,Map類是以鍵值對的形式來儲存元素(Key->Value),但是熟悉Map的人都知 道,Map中儲存的Key是唯一的。什麼意思呢?就是假如我們有兩個key相同,但value不同的元

Android開發中有用工具之--Log工具

util lena 日誌 日誌信息 stat 們的 常常 我們 imp 在開發的過程中。我們常常會使用Log來輸出日誌,幫助我們來調試程序 可是有時候並不能全然滿足我們的須要 ,比方我想知道這個日誌信息是來自於哪一個包 哪一個類 所以我們封裝一個這個Log類。方便我們的

最全面的Java字節byte操作,處理Java基本數據的轉換及進制轉換操作工具,流媒體及java底層開發項目常用工具

進制 string 常用工具類 cat i++ logs 指定位置 tput off 前言:用於處理Java基本數據的轉換及進制轉換操作工具 一、實現功能 1、int預byte互轉 2、int與byte[]互轉 3、short與byte互轉 4、short與byte[]互轉

web開發一些常用的工具的網站

項目目錄 圖標 nbsp 菜鳥 rip icons power html css som 持續更新中.......... 1. 網頁圖標網站: http://fontawesome.io 下面的鏈接瀏覽其提供的圖標: http://fontawesome.io/ico

MSCL超級工具(C#),開發人員必備,開發利器

cnblogs 分頁 導入導出 sqlserve context public 簡單 pac dir MSCL超強工具類庫 是基於C#開發的超強工具類集合,涵蓋了日常B/S或C/S開發的諸多方面,包含上百個常用封裝類(數據庫操作類全面支持Mysql、Access、Oracl

談毛豆鋼材進銷存管理系統:長沙一款專門為鋼材經銷商和鋼材生產企業設計開發的鋼材軟件

長沙毛豆科技 毛豆鋼材進銷存管理系統 長沙軟件開發 毛豆鋼材進銷存管理系統:專門為鋼材經銷商和鋼材生產企業設計開發的鋼材類軟件 長沙毛豆科技小編給大家介紹“毛豆鋼材進銷存管理系統”的基本功能:毛豆鋼材進銷存管理系

python-接口開發flask模塊(一)工具準備

update date lose code def let mit pip clas 我們常常聽說測試http接口、測試java接口,測試socket接口等等;那麽python這麽強大的語言當然也可以用來開發接口了。 flask模塊介紹: python中用來開發接口的模塊:

史上最全的開發工具(轉)

scp dbi bug 成對 截圖 depend 時間 sre invoke API銀行卡管理 → BankCheckcheckBankCard : 校驗銀行卡卡號是否合法getBankCardCheckCode: 從不含校驗位的銀行卡卡號采用 Luhm

MapReduce之Job工具開發

大數據 Hadoop MapReduce Java [toc] MapReduce之Job工具類開發 在MapReduce程序寫Mapper和Reducer的驅動程序時,有很多代碼都是重復性代碼,因此可以將其提取出來寫成一個工具類,後面再寫MapReduce程序時都會使用這個工具類。 Job

Android開發人員不得不收集的工具集合

一.Android開發人員不得不收集的工具類集合  ----收藏 https://github.com/RobertCow/RxTools 二.android 開發之listview工具集合框架 https://github.com/anzaizai/EasyRefresh

Android 常用開發工具

Android 好用的框架與UI效果demo收集 1.AndroidCommon 裡面幾乎包含你所有想要的工具類,如: 網路工具、SharedPreferences工具、時間工具、日誌工具、字串工具、Json工具、裝置資訊工具、APP工具類、bitmap的工具類等等 github