Google Guava新手教程
???? 以下資料整理自網(wǎng)絡(luò)
一、Google Guava入門介紹
引言
Guavaproject包括了若干被Google的 Java項(xiàng)目廣泛依賴 的核心庫(kù),比如:集合 [collections] 、緩存 [caching] 、原生類型支持 [primitives support] 、并發(fā)庫(kù) [concurrency libraries] 、通用注解 [common annotations] 、字符串處理 [string processing] 、I/O 等等。 全部這些工具每天都在被Google的project師應(yīng)用在產(chǎn)品服務(wù)中。
查閱Javadoc并不一定是學(xué)習(xí)這些庫(kù)最有效的方式。在此,我們希望通過(guò)此文檔為Guava中最流行和最強(qiáng)大的功能。提供更具可讀性和解釋性的說(shuō)明。
譯文格式說(shuō)明
- Guava中的類被首次引用時(shí),都會(huì)鏈接到Guava的API文檔。如:Optional<T>。
- Guava和JDK中的方法被引用時(shí)。一般都會(huì)鏈接到Guava或JDK的API文檔,一些人所共知的JDK方法除外。如:Optional.of(T), Map.get(key)。
- 譯者對(duì)文檔的額外說(shuō)明以斜體顯示,而且以“譯者注:”開始。
文件夾
1. 基本工具 [Basic utilities]
讓使用Java語(yǔ)言變得更舒適
1.1 使用和避免null:null是模棱兩可的,會(huì)引起令人困惑的錯(cuò)誤。有些時(shí)候它讓人非常不舒服。
非常多Guava工具類用高速失敗拒絕null值,而不是盲目地接受
1.2 前置條件: 讓方法中的條件檢查更簡(jiǎn)單
1.3 常見(jiàn)Object方法: 簡(jiǎn)化Object方法實(shí)現(xiàn)。如hashCode()和toString()
1.4 排序: Guava強(qiáng)大的”流暢風(fēng)格比較器”
1.5 Throwables:簡(jiǎn)化了異常和錯(cuò)誤的傳播與檢查
2. 集合[Collections]
Guava對(duì)JDK集合的擴(kuò)展,這是Guava最成熟和為人所知的部分
2.1 不可變集合: 用不變的集合進(jìn)行防御性編程和性能提升。
2.2 新集合類型: multisets, multimaps, tables, bidirectional maps等
2.3 強(qiáng)大的集合工具類: 提供java.util.Collections中沒(méi)有的集合工具
2.4 擴(kuò)展工具類:讓實(shí)現(xiàn)和擴(kuò)展集合類變得更easy。比方創(chuàng)建Collection的裝飾器,或?qū)崿F(xiàn)迭代器
3. 緩存[Caches]
Guava Cache:本地緩存實(shí)現(xiàn),支持多種緩存過(guò)期策略
4. 函數(shù)式風(fēng)格[Functional idioms]
Guava的函數(shù)式支持能夠顯著簡(jiǎn)化代碼。但請(qǐng)慎重使用它
5. 并發(fā)[Concurrency]
強(qiáng)大而簡(jiǎn)單的抽象,讓編寫正確的并發(fā)代碼更簡(jiǎn)單
5.1 ListenableFuture:完畢后觸發(fā)回調(diào)的Future
5.2 Service框架:抽象可開啟和關(guān)閉的服務(wù),幫助你維護(hù)服務(wù)的狀態(tài)邏輯
6. 字符串處理[Strings]
非常實(shí)用的字符串工具。包括切割、連接、填充等操作
7. 原生類型[Primitives]
擴(kuò)展 JDK 未提供的原生類型(如int、char)操作, 包括某些類型的無(wú)符號(hào)形式
8. 區(qū)間[Ranges]
可比較類型的區(qū)間API。包括連續(xù)和離散類型
9. I/O
簡(jiǎn)化I/O尤其是I/O流和文件的操作,針對(duì)Java5和6版本號(hào)
10. 散列[Hash]
提供比Object.hashCode()更復(fù)雜的散列實(shí)現(xiàn)。并提供布魯姆過(guò)濾器的實(shí)現(xiàn)
11. 事件總線[EventBus]
公布-訂閱模式的組件通信,但組件不須要顯式地注冊(cè)到其它組件中
12. 數(shù)學(xué)運(yùn)算[Math]
優(yōu)化的、充分測(cè)試的數(shù)學(xué)工具類
13. 反射[Reflection]
Guava 的 Java 反射機(jī)制工具類
???? 中文參考站點(diǎn):http://ifeve.com/google-guava/
二、Guava學(xué)習(xí)筆記:Preconditions優(yōu)雅的檢驗(yàn)參數(shù)
在日常開發(fā)中。我們常常會(huì)對(duì)方法的輸入?yún)?shù)做一些數(shù)據(jù)格式上的驗(yàn)證,以便保證方法能夠依照正常流程運(yùn)行下去。對(duì)于可預(yù)知的一些數(shù)據(jù)上的錯(cuò)誤。我們一定要做事前檢測(cè)和推斷,來(lái)避免程序流程出錯(cuò),而不是全然通過(guò)錯(cuò)誤處理來(lái)保證流程正確運(yùn)行,畢竟錯(cuò)誤處理是比較消耗資源的方式。
在尋常情況下我們對(duì)參數(shù)的推斷都須要自己來(lái)逐個(gè)寫方法推斷,代碼量不少而且復(fù)用性不高,例如以下所看到的:
import org.junit.Test;public class PreconditionsTest {@Testpublic void Preconditions() throws Exception { getPerson(8,"peida");getPerson(-9,"peida");getPerson(8,"");getPerson(8,null);}public static void getPerson(int age,String neme)throws Exception{if(age>0&&neme!=null&&neme.isEmpty()!=true){System.out.println("a person age:"+age+",neme:"+neme);}else{System.out.println("參數(shù)輸入有誤。");}} }說(shuō)明:參數(shù)驗(yàn)證。我們每次都要加入if語(yǔ)句來(lái)做推斷, 反復(fù)的工作會(huì)做好多次。getPerson方法僅僅有2個(gè)參數(shù)。驗(yàn)證規(guī)則也不是非常復(fù)雜,假設(shè)參數(shù)過(guò)度,驗(yàn)證規(guī)則復(fù)雜后,上面代碼的可讀性都會(huì)非常差的,復(fù)用性就更談不上了。
Guava類庫(kù)中提供了一個(gè)作參數(shù)檢查的工具類--Preconditions類,?該類能夠大大地簡(jiǎn)化我們代碼中對(duì)于參數(shù)的預(yù)推斷和處理。讓我們對(duì)方法輸入?yún)?shù)的驗(yàn)證實(shí)現(xiàn)起來(lái)更加簡(jiǎn)單優(yōu)雅。以下我們看看Preconditions類的使用實(shí)例:Preconditions里面的方法:
1 .checkArgument(boolean) :
功能描寫敘述:檢查boolean是否為真。 用作方法中檢查參數(shù)
失敗時(shí)拋出的異常類型: IllegalArgumentException
2.checkNotNull(T): ?? ?
功能描寫敘述:檢查value不為null, 直接返回value;
失敗時(shí)拋出的異常類型:NullPointerException
3.checkState(boolean):
功能描寫敘述:檢查對(duì)象的一些狀態(tài)。不依賴方法參數(shù)。 比如, Iterator能夠用來(lái)next是否在remove之前被調(diào)用。
失敗時(shí)拋出的異常類型:IllegalStateException
4.checkElementIndex(int index, int size):
功能描寫敘述:檢查index是否為在一個(gè)長(zhǎng)度為size的list, string或array合法的范圍。 index的范圍區(qū)間是[0, size)(包括0不包括size)。
無(wú)需直接傳入list, string或array, 僅僅需傳入大小。返回index。??
失敗時(shí)拋出的異常類型:IndexOutOfBoundsException
5.checkPositionIndex(int index, int size):
功能描寫敘述:檢查位置index是否為在一個(gè)長(zhǎng)度為size的list。 string或array合法的范圍。 index的范圍區(qū)間是[0, size)(包括0不包括size)。無(wú)需直接傳入list。 string或array, 僅僅需傳入大小。返回index。
失敗時(shí)拋出的異常類型:IndexOutOfBoundsException
6.checkPositionIndexes(int start, int end, int size):
功能描寫敘述:檢查[start, end)是一個(gè)長(zhǎng)度為size的list。 string或array合法的范圍子集。
伴隨著錯(cuò)誤信息。
失敗時(shí)拋出的異常類型:IndexOutOfBoundsException
一個(gè)比較實(shí)用實(shí)例:
import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.google.common.base.Preconditions;public class PreconditionsTest {@Testpublic void Preconditions() throws Exception { getPersonByPrecondition(8,"peida");try {getPersonByPrecondition(-9,"peida");} catch (Exception e) {System.out.println(e.getMessage());}try {getPersonByPrecondition(8,"");} catch (Exception e) {System.out.println(e.getMessage());}try {getPersonByPrecondition(8,null);} catch (Exception e) {System.out.println(e.getMessage());}List<Integer> intList=new ArrayList<Integer> ();for(int i=0;i<10;i++){ try {checkState(intList,9);intList.add(i);} catch (Exception e) {System.out.println(e.getMessage());}}try {checkPositionIndex(intList,3); } catch (Exception e) {System.out.println(e.getMessage());}try {checkPositionIndex(intList,13); } catch (Exception e) {System.out.println(e.getMessage());}try {checkPositionIndexes(intList,3,7);} catch (Exception e) {System.out.println(e.getMessage());}try {checkPositionIndexes(intList,3,17);} catch (Exception e) {System.out.println(e.getMessage());}try {checkPositionIndexes(intList,13,17);} catch (Exception e) {System.out.println(e.getMessage());}try {checkElementIndex(intList,6);} catch (Exception e) {System.out.println(e.getMessage());}try {checkElementIndex(intList,16);} catch (Exception e) {System.out.println(e.getMessage());}}public static void getPersonByPrecondition(int age,String neme)throws Exception{Preconditions.checkNotNull(neme, "neme為null");Preconditions.checkArgument(neme.length()>0, "neme為\'\'");Preconditions.checkArgument(age>0, "age 必須大于0");System.out.println("a person age:"+age+",neme:"+neme);}public static void checkState(List<Integer> intList,int index)throws Exception{//表達(dá)式為true不拋異常Preconditions.checkState(intList.size()<index, " intList size 不能大于"+index);}public static void checkPositionIndex(List<Integer> intList,int index) throws Exception{Preconditions.checkPositionIndex(index, intList.size(), "index "+index+" 不在 list中。 List size為:"+intList.size());}public static void checkPositionIndexes(List<Integer> intList,int start,int end) throws Exception{Preconditions.checkPositionIndexes(start, end, intList.size());}public static void checkElementIndex(List<Integer> intList,int index) throws Exception{Preconditions.checkElementIndex(index, intList.size(),"index 為 "+index+" 不在 list中, List size為: "+intList.size());} }輸出結(jié)果:
a person age:8,neme:peida age 必須大于0 neme為'' neme為nullintList size 不能大于9 index 13 不在 list中, List size為:9 (13) must not be greater than size (9) end index (17) must not be greater than size (9) start index (13) must not be greater than size (9) index 為 16 不在 list中, List size為: 9 (16) must be less than size (9)?
Guava的preconditions有這樣幾個(gè)長(zhǎng)處:
在靜態(tài)導(dǎo)入后, 方法非常明白無(wú)歧義, checkNotNull能夠清楚地告訴你它是干什么的, 它會(huì)拋出如何的異常.
checkNotNull在驗(yàn)證通過(guò)后直接返回, 能夠這樣方便地寫代碼: this.field = checkNotNull(field).
????? 簡(jiǎn)單而又強(qiáng)大的可變參數(shù)'printf'風(fēng)格的自己定義錯(cuò)誤信息.
總結(jié)
以上是生活随笔為你收集整理的Google Guava新手教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 做梦梦到腰带是什么意思
- 下一篇: 解决Mac10.13 Pod报错 -ba