1. 程式人生 > >Google guava工具類的介紹和使用

Google guava工具類的介紹和使用

轉載自 http://blog.csdn.net/yyychyzzzz/article/details/54983574

概述

工具類 就是封裝平常用的方法,不需要你重複造輪子,節省開發人員時間,提高工作效率。谷歌作為大公司,當然會從日常的工作中提取中很多高效率的方法出來。所以就誕生了guava。。

  • 高效設計良好的API,被Google的開發者設計,實現和使用
  • 遵循高效的java語法實踐
  • 使程式碼更刻度,簡潔,簡單
  • 節約時間,資源,提高生產力 Guava工程包含了若干被Google的 Java專案廣泛依賴 的核心庫,例如:
  1. 集合 [collections]
  2. 快取 [caching]
  3. 原生型別支援 [primitives support]
  4. 併發庫 [concurrency libraries]
  5. 通用註解 [common annotations]
  6. 字串處理 [string processing]
  7. I/O 等等。

使用

引入maven依賴(就是引入jar包)

(從版本號就能看出 guava是一步步改進的,並且跟隨的jdk不斷的提取其中優秀的部分)

1234567'''<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>20.0</version></dependency>'''

1.集合的建立

123456789// 普通Collection的建立List<String> list = Lists.newArrayList();Set<String> set = Sets.newHashSet();Map<String, String> map = Maps.newHashMap();// 不變Collection的建立ImmutableList<String> iList = ImmutableList.of("a", "b", "c");ImmutableSet<String> iSet = ImmutableSet.of("e1", "e2");ImmutableMap<String, String> iMap = ImmutableMap.of("k1", "v1", "k2", "v2");

建立不可變集合
先理解什麼是immutable(不可變)物件

1.在多執行緒操作下,是執行緒安全的。

2.所有不可變集合會比可變集合更有效的利用資源。

3.中途不可改變

12> ImmutableList<String> immutableList = ImmutableList.of("1","2","3","4");>

這句話就聲明瞭一個不可變的list集合,裡面有資料1,2,3,4。方法中的==操作集合的方法都宣告過期==,並且丟擲異常。

沒用guava之前是需要宣告並且加各種包裹集合才能實現這個功能。

當我們需要一個map中包含key為String value為List型別的時候 以前我們是這樣寫的

123456Map<String,List<Integer>> map = new HashMap<String,List<Integer>>();List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);map.put("aa", list);System.out.println(map.get("aa"));//[1, 2]

而現在

1234Multimap<String,Integer> map = ArrayListMultimap.create();map.put("aa", 1);map.put("aa", 2);System.out.println(map.get("aa")); //[1, 2]
其他的黑科技集合
12345678910111213MultiSet: 無序+可重複 count()方法獲取單詞的次數 增強了可讀性+操作簡單建立方式: Multiset<String> set = HashMultiset.create();Multimap: key-value key可以重複建立方式: Multimap<String, String> teachers = ArrayListMultimap.create();BiMap: 雙向Map(Bidirectional Map) 鍵與值都不能重複建立方式: BiMap<String, String> biMap = HashBiMap.create();Table: 雙鍵的Map Map--> Table-->rowKey+columnKey+value //和sql中的聯合主鍵有點像建立方式: Table<String, String, Integer> tables = HashBasedTable.create();...等等(guava中還有很多java裡面沒有給出的集合型別)

2.將集合轉換為特定規則的字串

以前我們將list轉換為特定規則的字串是這樣寫的:

123456789101112131415161718//use javaList<String> list = new ArrayList<String>();list.add("aa");list.add("bb");list.add("cc");String str = "";for(int i=0; i<list.size(); i++){str = str + "-" +list.get(i);}//str 為-aa-bb-cc//use guavaList<String> list = new ArrayList<String>();list.add("aa");list.add("bb");list.add("cc");String result = Joiner.on("-").join(list);//result為 aa-bb-cc
把map集合轉換為特定規則的字串
12345Map<String, Integer> map = Maps.newHashMap();map.put("xiaoming", 12);map.put("xiaohong",13);String result = Joiner.on(",").withKeyValueSeparator("=").join(map);// result為 xiaoming=12,xiaohong=13

3.將String轉換為特定的集合

123456789101112//use javaList<String> list = new ArrayList<String>();String a = "1-2-3-4-5-6";String[] strs = a.split("-");for(int i=0; i<strs.length; i++){list.add(strs[i]);}//use guavaString str = "1-2-3-4-5-6";List<String> list = Splitter.on("-").splitToList(str);//list為 [1, 2, 3, 4, 5, 6]

如果

1str="1-2-3-4- 5- 6 ";

guava還可以使用

==使用 “-“ 切分字串並去除空串與空格== omitEmptyStrings().trimResults() 去除空串與空格

123String str = "1-2-3-4- 5- 6 ";List<String> list = Splitter.on("-").omitEmptyStrings().trimResults().splitToList(str);System.out.println(list);

就能忽略中間的空格

將String轉換為map
12String str = "xiaoming=11,xiaohong=23";Map<String,String> map = Splitter.on(",").withKeyValueSeparator("=").split(str);

4.guava還支援多個字元切割,或者特定的正則分隔

12String input = "aa.dd,,ff,,.";List<String> result = Splitter.onPattern("[.|,]").omitEmptyStrings().splitToList(input);

==關於字串的操作 都是在Splitter這個類上進行的。==

123456// 判斷匹配結果boolean result = CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z')).matches('K'); //true// 保留數字文字String s1 = CharMatcher.digit().retainFrom("abc 123 efg"); //123// 刪除數字文字String s2 = CharMatcher.digit().removeFrom("abc 123 efg"); //abc efg

5. 集合的過濾

我們對於集合的過濾,思路就是迭代,然後再具體對每一個數判斷,這樣的程式碼放在程式中,難免會顯得很臃腫,雖然功能都有,但是很不好看。

guava寫法

123456789101112131415161718//按照條件過濾ImmutableList<String> names = ImmutableList.of("begin", "code", "Guava", "Java");Iterable<String> fitered = Iterables.filter(names, Predicates.or(Predicates.equalTo("Guava"), Predicates.equalTo("Java")));System.out.println(fitered); // [Guava, Java]//自定義過濾條件 使用自定義回撥方法對Map的每個Value進行操作ImmutableMap<String, Integer> m = ImmutableMap.of("begin", 12, "code", 15);// Function<F, T> F表示apply()方法input的型別,T表示apply()方法返回型別Map<String, Integer> m2 = Maps.transformValues(m, new Function<Integer, Integer>() {public Integer apply(Integer input) {if(input>12){return input;}else{return input+1;}}});System.out.println(m2); //{begin=13, code=15}

set的交集, 並集, 差集

1234567891011121314151617HashSet setA = newHashSet(1, 2, 3, 4, 5);HashSet setB = newHashSet(4, 5, 6, 7, 8);SetView union = Sets.union(setA, setB);System.out.println("union:");for (Integer integer : union)System.out.println(integer); //union:12345867SetView difference = Sets.difference(setA, setB);System.out.println("difference:");for (Integer integer : difference)System.out.println(integer); //difference:123SetView intersection = Sets.intersection(setA, setB);System.out.println("intersection:");for (Integer integer : intersection)System.out.println(integer); //intersection:45

map的交集,並集,差集

123456MapDifference differenceMap = Maps.difference(mapA, mapB);differenceMap.areEqual();Map entriesDiffering = differenceMap.entriesDiffering();Map entriesOnlyOnLeft = differenceMap.entriesOnlyOnLeft();Map entriesOnlyOnRight = differenceMap.entriesOnlyOnRight();Map entriesInCommon = differenceMap.entriesInCommon();

6.檢查引數

1234567891011121314151617//use javaif(list!=null && list.size()>0)'''if(str!=null && str.length()>0)'''if(str !=null && !str.isEmpty())//use guavaif(!Strings.isNullOrEmpty(str))//use javaif (count <= 0) {throw new IllegalArgumentException("must be positive: " + count);}//use guavaPreconditions.checkArgument(count > 0, "must be positive: %s", count);

免去了很多麻煩!並且會使你的程式碼看上去更好看。而不是程式碼裡面充斥著!=null, !=””

(問答系統原始碼裡面有很多這種程式碼,後一版得抓緊改掉。。)

檢查是否為空,不僅僅是字串型別,其他型別的判斷 全部都封裝在 Preconditions類裡 裡面的方法全為靜態。

其中的一個方法的原始碼

1234567@CanIgnoreReturnValuepublic static <T> T checkNotNull(T reference) {if (reference == null) {throw new NullPointerException();}return reference;}
方法宣告(不包括額外引數)描述檢查失敗時丟擲的異常
checkArgument(boolean)檢查boolean是否為true,用來檢查傳遞給方法的引數。IllegalArgumentException
checkNotNull(T)檢查value是否為null,該方法直接返回value,因此可以內嵌使用checkNotNull。NullPointerException
checkState(boolean)用來檢查物件的某些狀態。IllegalStateException
checkElementIndex(int index, int size)檢查index作為索引值對某個列表、字串或陣列是否有效。index>=0 && index<size *IndexOutOfBoundsException
checkPositionIndexes(int start, int end, int size)檢查[start, end]表示的位置範圍對某個列表、字串或陣列是否有效*IndexOutOfBoundsException

7.MoreObjects

這個方法是在Objects過期後 官方推薦使用的替代品,該類最大的好處就是不用大量的重寫toString,用一種很優雅的方式實現重寫,或者在某個場景定製使用。

1234Person person = new Person("aa",11);String str = MoreObjects.toStringHelper("Person").add("age", person.getAge()).toString();System.out.println(str);//輸出Person{age=11}

8.強大的Ordering排序器

排序器[Ordering]是Guava流暢風格比較器[Comparator]的實現,它可以用來為構建複雜的比較器,以完成集合排序的功能。

123456789natural() 對可排序型別做自然排序,如數字按大小,日期按先後排序usingToString() 按物件的字串形式做字典排序[lexicographical ordering]from(Comparator) 把給定的Comparator轉化為排序器reverse() 獲取語義相反的排序器nullsFirst() 使用當前排序器,但額外把null值排到最前面。nullsLast() 使用當前排序器,但額外把null值排到最後面。compound(Comparator) 合成另一個比較器,以處理當前排序器中的相等情況。lexicographical() 基於處理型別T的排序器,返回該型別的可迭代物件Iterable<T>的排序器。onResultOf(Function) 對集合中元素呼叫Function,再按返回值用當前排序器排序。
123456789Person person = new Person("aa",14); //String name ,Integer agePerson ps = new Person("bb",13);Ordering<Person> byOrdering = Ordering.natural().nullsFirst().onResultOf(new Function<Person,String>(){public String apply(Person person){return person.age.toString();}});byOrdering.compare(person, ps);System.out.println(byOrdering.compare(person, ps)); //1 person的年齡比ps大 所以輸出1

9.計算中間程式碼的執行時間

123456Stopwatch stopwatch = Stopwatch.createStarted();for(int i=0; i<100000; i++){}long nanos = stopwatch.elapsed(TimeUnit.MILLISECONDS);System.out.println(nanos);

TimeUnit 可以指定時間輸出精確到多少時間

10.檔案操作

以前我們寫檔案讀取的時候要定義緩衝區,各種條件判斷,各種$%#[email protected]#

而現在我們只需要使用好guava的api 就能使程式碼變得簡潔,並且不用擔心因為寫錯邏輯而背鍋了

123456789101112File file = new File("/test.txt");List<String> list = null;try {list = Files.readLines(file, Charsets.UTF_8);} catch (Exception e) {}Files.copy(from,to); //複製檔案Files.deleteDirectoryContents(File directory); //刪除資料夾下的內容(包括檔案與子資料夾)Files.deleteRecursively(File file); //刪除檔案或者資料夾Files.move(File from, File to); //移動檔案URL url = Resources.getResource("abc.xml"); //獲取classpath根下的abc.xml檔案url

Files類中還有許多方法可以用,可以多多翻閱。

11.guava快取

guava的快取設計的比較巧妙,可以很精巧的使用。guava快取建立分為兩種,一種是CacheLoader,另一種則是callback方式

CacheLoader:

12345678910111213141516LoadingCache<String,String> cahceBuilder=CacheBuilder.newBuilder().build(new CacheLoader<String, String>(){@Overridepublic String load(String key) throws Exception {String strProValue="hello "+key+"!";return strProValue;}});System.out.println(cahceBuilder.apply("begincode")); //hello begincode!System.out.println(cahceBuilder.get("begincode")); //hello begincode!System.out.println(cahceBuilder.get("wen")); //hello wen!System.out.println(cahceBuilder.apply("wen")); //hello wen!System.out.println(cahceBuilder.apply("da"));//hello da!cahceBuilder.put("begin", "code");System.out.println(cahceBuilder.get("begin")); //code
api中已經把apply宣告為過期,宣告中推薦使用get方法獲取值

callback方式:

12345678Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000).build();String resultVal = cache.get("code", new Callable<String>() {public String call() {String strProValue="begin "+"code"+"!";return strProValue;}});System.out.println("value : " + resultVal); //value : begin code!

以上只是guava使用的一小部分,guava是個大的工具類,第一版guava是2010年釋出的,每一版的更新和迭代都是一種創新。

jdk的升級很多都是借鑑guava裡面的思想來進行的。

以上可能會有錯誤或者表意不全的地方,歡迎評論指出。


相關推薦

Google guava工具介紹使用

轉載自 http://blog.csdn.net/yyychyzzzz/article/details/54983574概述工具類 就是封裝平常用的方法,不需要你重複造輪子,節省開發人員時間,提高工作效率。谷歌作為大公司,當然會從日常的工作中提取中很多高效率的方法出來。所以就

學習Google guava工具

1、前言 好的工具類能節約開發者的開發成本,今天學習一個新的工具類guava。guava是谷歌出品的一款開源java工具類,提供一些常用的方法。以下指示一些常用的方法,guava還提供其他的一些方法,可以通過線上API自行學習。 2、座標 <dependency>  &n

企業開發——googleGuava工具

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

UI自動化測試簡介及Selenium工具介紹環境搭建

版本 ebe 需求分析 核心 nis rep color 基於 多語 自動化測試簡介 1.1何為自動化測試?   是把以人為驅動的測試轉化為機器執行的一種過程,它是一種以程序測試程序的過程。換言之,就是以程序實現的方式來代替手工測試。 1.2自動化測試分類   分為功能自動

istringstream、ostringstream、stringstream 介紹 stringstream clear函數的真正用途

輸入 emp ren 一個 str 三種 == 期望 數據轉換 istringstream、ostringstream、stringstream 類介紹 和 stringstream類 clear函數的真正用途 來源: http://blog.csdn.net/TQH_Ca

PHP的依賴管理工具Composer介紹使用

PHP的依賴管理工具Composer介紹官方文檔:http://docs.phpcomposer.com/00-intro.html#System-Requirements linx上安裝:下載 Composer 的可執行文件 局部安裝要真正獲取 Composer,我們需要做兩件事。首先安裝 Composer

spring控制並發數的工具ConcurrencyThrottleSupportConcurrencyThrottleInterceptor

htm enc proc was cnblogs 父類 code url invoke 在ConcurrencyThrottleSupport類中,簡單的通過synchronized和wati and notify達到控制線程數量的效果,從而實現限流的策略。 一、類圖

Tensorboard工具介紹使用方法

Tensorboard中的資料形式: Tensorboard可以記錄與展示以下資料形式:  標量Scalars; 圖片Images;  音訊Audio; 計算圖Graph;  資料分佈Distribution; 嵌入向量Embedding

spring註解工具AnnotatedElementUtilsAnnotationUtils

一、前言   spring為開發人員提供了兩個搜尋註解的工具類,分別是AnnotatedElementUtils和AnnotationUtils。在使用的時候,總是傻傻分不清,什麼情況下使用哪一個。於是我做了如下的整理和總結。 二、AnnotationUtils官方解釋   功能   用於處理註解,處

Apache Commons 工具介紹及使用

Apache Commons包含了很多開源的工具,用於解決平時程式設計經常會遇到的問題,減少重複勞動。 元件 功能介紹 BeanUtils 提供了對於JavaBean進行各種操作,

redis工具學習使用(RedisTemplate,StringRedisTemplate)

RedisTemplate ,StringRedisTemplate 是對redis操作的一個封裝類.類似jdbcTemplate RedisTemplate是一個泛型類,RedisTemplate可以對任何型別的key-value鍵值對操作。(hash結構同

[Google Guava] 1.1-使用避免null

原文連結 譯文連結 譯者: 沈義揚    Doug Lea 說,“Null 真糟糕。”   當Sir C. A. R. Hoare 使用了null引用後說,”使用它導致了十億美金的錯誤。” 輕率地使用null可能會導致很多令人驚愕的問題。通過學習Google底層程式碼庫,我們發現95%的集合類

php的mysql操作工具pdomysqli

從php7開始mysql擴充套件庫已經被全面移除,原因暫不清楚,官方推薦我們使用mysqli和pdo,這次就針對pdo和mysqli分享下我的兩個工具類 1 PDO的mysql操作工具類 這種方式已經用的越來越多了,pdo使用面向物件的方式操作資料庫,pdo是很多人都比較

Android UI優化—GPU過度繪製檢測工具介紹使用

GPU過度繪製 指螢幕上的一個畫素被繪製多次(超過一次) 如下圖 GPU過渡繪製監測工具使用方式 GPU過渡繪製監測工具的作用如下: 1、找出應用中哪些地方存在不必要的渲染 2、幫助開發者發現哪些地方可以減少渲染,提高程式執行效率 開啟方式如下: 設定-開發者選項-除錯

多執行緒學習筆記六之併發工具CountDownLatchCyclicBarrier

目錄 簡介 CountDownLatch 示例 實現分析 CountDownLatch與Thread.join() CyclicBarrier 實現分析 CountDownLatch和CyclicBarrier區別 簡介

Apache Commons 工具介紹

//官方示例 public class PoolingDataSources { public static void main(String[] args) { System.out.println("載入jdbc驅動");

Netty原始碼分析第8章(高效能工具FastThreadLocalRecycler)---->第1節: FastThreadLocal的使用建立

  Netty原始碼分析第八章: 高效能工具類FastThreadLocal和Recycler   概述:           FastThreadLocal我們在剖析堆外記憶體分配的時候簡單介紹過, 它類似於JDK的T

Netty原始碼分析第8章(高效能工具FastThreadLocalRecycler)---->第2節: FastThreadLocal的set方法

  Netty原始碼分析第八章: 高效能工具類FastThreadLocal和Recycler   第二節: FastThreadLocal的set方法   上一小節我們學習了FastThreadLocal的建立和get方法的實現邏輯, 這一小節學習

Netty原始碼分析第8章(高效能工具FastThreadLocalRecycler)---->第5節: 同線程回收物件

  Netty原始碼分析第八章: 高效能工具類FastThreadLocal和Recycler   第五節: 同線程回收物件   上一小節剖析了從recycler中獲取一個物件, 這一小節分析在建立和回收是同線程的前提下, recycler是如何進行回收的

Netty原始碼分析第8章(高效能工具FastThreadLocalRecycler)---->第6節: 異執行緒回收物件

  Netty原始碼分析第八章: 高效能工具類FastThreadLocal和Recycler   第六節: 異執行緒回收物件   異執行緒回收物件, 就是建立物件和回收物件不在同一條執行緒的情況下, 物件回收的邏輯 我們之前小節簡單介紹過, 異執行緒回收物