Google Guava入門教程

     如下資料整理自網絡html

1、Google Guava入門介紹

引言java

Guava 工程包含了若干被Google的 Java項目普遍依賴 的核心庫,例如:集合 [collections] 、緩存 [caching] 、原生類型支持 [primitives support] 、併發庫 [concurrency libraries] 、通用註解 [common annotations] 、字符串處理 [string processing] 、I/O 等等。 全部這些工具天天都在被Google的工程師應用在產品服務中。git

查閱Javadoc並不必定是學習這些庫最有效的方式。在此,咱們但願經過此文檔爲Guava中最流行和最強大的功能,提供更具可讀性和解釋性的說明。編程

 

譯文格式說明緩存

  • Guava中的類被首次引用時,都會連接到Guava的API文檔。如:Optional<T>
  • Guava和JDK中的方法被引用時,通常都會連接到Guava或JDK的API文檔,一些人所共知的JDK方法除外。如:Optional.of(T), Map.get(key)。
  • 譯者對文檔的額外說明以斜體顯示,而且以「譯者注」開始。

目錄網絡

1. 基本工具 [Basic utilities]

讓使用Java語言變得更溫馨併發

1.1 使用和避免null:null是模棱兩可的,會引發使人困惑的錯誤,有些時候它讓人很不舒服。不少Guava工具類用快速失敗拒絕null值,而不是盲目地接受框架

1.2 前置條件: 讓方法中的條件檢查更簡單less

1.3 常見Object方法: 簡化Object方法實現,如hashCode()和toString()函數式編程

1.4 排序: Guava強大的」流暢風格比較器」

1.5 Throwables:簡化了異常和錯誤的傳播與檢查

2. 集合[Collections]

Guava對JDK集合的擴展,這是Guava最成熟和爲人所知的部分

2.1 不可變集合: 用不變的集合進行防護性編程和性能提高。

2.2 新集合類型: multisets, multimaps, tables, bidirectional maps等

2.3 強大的集合工具類: 提供java.util.Collections中沒有的集合工具

2.4 擴展工具類:讓實現和擴展集合類變得更容易,好比建立Collection的裝飾器,或實現迭代器

3. 緩存[Caches]

Guava Cache:本地緩存實現,支持多種緩存過時策略

4. 函數式風格[Functional idioms]

Guava的函數式支持能夠顯著簡化代碼,但請謹慎使用它

5. 併發[Concurrency]

強大而簡單的抽象,讓編寫正確的併發代碼更簡單

5.1 ListenableFuture:完成後觸發回調的Future

5.2 Service框架:抽象可開啓和關閉的服務,幫助你維護服務的狀態邏輯

6. 字符串處理[Strings]

很是有用的字符串工具,包括分割、鏈接、填充等操做

7. 原生類型[Primitives]

擴展 JDK 未提供的原生類型(如int、char)操做, 包括某些類型的無符號形式

8. 區間[Ranges]

可比較類型的區間API,包括連續和離散類型

9. I/O

簡化I/O尤爲是I/O流和文件的操做,針對Java5和6版本

10. 散列[Hash]

提供比Object.hashCode()更復雜的散列實現,並提供布魯姆過濾器的實現

11. 事件總線[EventBus]

發佈-訂閱模式的組件通訊,但組件不須要顯式地註冊到其餘組件中

12. 數學運算[Math]

優化的、充分測試的數學工具類

13. 反射[Reflection]

Guava 的 Java 反射機制工具類

     中文參考網站:http://ifeve.com/google-guava/

2、Guava學習筆記:Preconditions優雅的檢驗參數

   在平常開發中,咱們常常會對方法的輸入參數作一些數據格式上的驗證,以便保證方法可以按照正常流程執行下去。對於可預知的一些數據上的錯誤,咱們必定要 作事前檢測和判斷,來避免程序流程出錯,而不是徹底經過錯誤處理來保證流程正確執行,畢竟錯誤處理是比較消耗資源的方式。在日常狀況下咱們對參數的判斷都 須要本身來逐個寫方法判斷,代碼量很多而且複用性不高,以下所示:

複製代碼
import org.junit.Test;

public class PreconditionsTest { @Test public 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("參數輸入有誤!"); } } }
複製代碼

  說明:參數驗證,咱們每次都要添加if語句來作判斷, 重複的工做會作好屢次。getPerson方法只有2個參數,驗證規則也不是很複雜,若是參數過分,驗證規則複雜後,上面代碼的可讀性都會不好的,複用性就更談不上了。

  Guava類庫中提供了一個做參數檢查的工具類--Preconditions類, 該類能夠大大地簡化咱們代碼中對於參數的預判斷和處理,讓咱們對方法輸入參數的驗證明現起來更加簡單優雅,下面咱們看看Preconditions類的使用實例:

Preconditions裏面的方法:

  1 .checkArgument(boolean) :
  功能描述:檢查boolean是否爲真。 用做方法中檢查參數
  失敗時拋出的異常類型: IllegalArgumentException

  2.checkNotNull(T):     
  功能描述:檢查value不爲null, 直接返回value;
  失敗時拋出的異常類型:NullPointerException

  3.checkState(boolean):
  功能描述:檢查對象的一些狀態,不依賴方法參數。 例如, Iterator能夠用來next是否在remove以前被調用。
  失敗時拋出的異常類型:IllegalStateException

  4.checkElementIndex(int index, int size):
   功能描述:檢查index是否爲在一個長度爲size的list, string或array合法的範圍。 index的範圍區間是[0, size)(包含0不包含size)。無需直接傳入list, string或array, 只需傳入大小。返回index。  
  失敗時拋出的異常類型:IndexOutOfBoundsException


  5.checkPositionIndex(int index, int size):
   功能描述:檢查位置index是否爲在一個長度爲size的list, string或array合法的範圍。 index的範圍區間是[0, size)(包含0不包含size)。無需直接傳入list, string或array, 只需傳入大小。返回index。
  失敗時拋出的異常類型:IndexOutOfBoundsException

  6.checkPositionIndexes(int start, int end, int size):
  功能描述:檢查[start, end)是一個長度爲size的list, string或array合法的範圍子集。伴隨着錯誤信息。
  失敗時拋出的異常類型:IndexOutOfBoundsException

  一個比較實用實例:

複製代碼
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import com.google.common.base.Preconditions;

public class PreconditionsTest { @Test public 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{ //表達式爲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()); } }
複製代碼

  輸出結果:

複製代碼
a person age:8,neme:peida age 必須大於0 neme爲'' neme爲null intList 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有這樣幾個優勢:

  在靜態導入後, 方法很明確無歧義, checkNotNull能夠清楚地告訴你它是幹什麼的, 它會拋出怎樣的異常.
  checkNotNull在驗證經過後直接返回, 能夠這樣方便地寫代碼: this.field = checkNotNull(field).
      簡單而又強大的可變參數'printf'風格的自定義錯誤信息.

參考文章:http://www.baidu.com/link?url=BIz5TsQ_MlPY9Jq3_Cbb0qMO75p35BLdZWPc0qyfgOXazg7VrTi365XMMs-exrXAqHzen-M2EzWbuLSeI7Ydl_

相關文章
相關標籤/搜索