Google guava工具類的介紹和使用
轉載自 http://blog.csdn.net/yyychyzzzz/article/details/54983574
概述
工具類 就是封裝平常用的方法,不需要你重複造輪子,節省開發人員時間,提高工作效率。谷歌作為大公司,當然會從日常的工作中提取中很多高效率的方法出來。所以就誕生了guava。。
- 高效設計良好的API,被Google的開發者設計,實現和使用
- 遵循高效的java語法實踐
- 使程式碼更刻度,簡潔,簡單
- 節約時間,資源,提高生產力 Guava工程包含了若干被Google的 Java專案廣泛依賴 的核心庫,例如:
- 集合 [collections]
- 快取 [caching]
- 原生型別支援 [primitives support]
- 併發庫 [concurrency libraries]
- 通用註解 [common annotations]
- 字串處理 [string processing]
- 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型別的時候 以前我們是這樣寫的
123456 | Map<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] |
而現在
1234 | Multimap<String,Integer> map = ArrayListMultimap.create();map.put("aa", 1);map.put("aa", 2);System.out.println(map.get("aa")); //[1, 2] |
其他的黑科技集合
12345678910111213 | MultiSet: 無序+可重複 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集合轉換為特定規則的字串
12345 | Map<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] |
如果
1 | str="1-2-3-4- 5- 6 "; |
guava還可以使用
==使用 “-“ 切分字串並去除空串與空格== omitEmptyStrings().trimResults() 去除空串與空格
123 String str = "1-2-3-4- 5- 6 ";List<String> list = Splitter.on("-").omitEmptyStrings().trimResults().splitToList(str);System.out.println(list);
就能忽略中間的空格
將String轉換為map
12 | String str = "xiaoming=11,xiaohong=23";Map<String,String> map = Splitter.on(",").withKeyValueSeparator("=").split(str); |
4.guava還支援多個字元切割,或者特定的正則分隔
12 | String 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的交集, 並集, 差集
1234567891011121314151617 | HashSet 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的交集,並集,差集
123456 | MapDifference 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,用一種很優雅的方式實現重寫,或者在某個場景定製使用。
1234 | Person 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]的實現,它可以用來為構建複雜的比較器,以完成集合排序的功能。
123456789 | natural() 對可排序型別做自然排序,如數字按大小,日期按先後排序usingToString() 按物件的字串形式做字典排序[lexicographical ordering]from(Comparator) 把給定的Comparator轉化為排序器reverse() 獲取語義相反的排序器nullsFirst() 使用當前排序器,但額外把null值排到最前面。nullsLast() 使用當前排序器,但額外把null值排到最後面。compound(Comparator) 合成另一個比較器,以處理當前排序器中的相等情況。lexicographical() 基於處理型別T的排序器,返回該型別的可迭代物件Iterable<T>的排序器。onResultOf(Function) 對集合中元素呼叫Function,再按返回值用當前排序器排序。 |
123456789 | Person 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.計算中間程式碼的執行時間
123456 | Stopwatch 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 就能使程式碼變得簡潔,並且不用擔心因為寫錯邏輯而背鍋了
123456789101112 | File 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:
12345678910111213141516 | LoadingCache<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方式:
12345678 | Cache<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
企業開發——google的Guava工具類
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控制並發數的工具類ConcurrencyThrottleSupport和ConcurrencyThrottleInterceptor
htm enc proc was cnblogs 父類 code url invoke 在ConcurrencyThrottleSupport類中,簡單的通過synchronized和wati and notify達到控制線程數量的效果,從而實現限流的策略。 一、類圖
Tensorboard工具的介紹和使用方法
Tensorboard中的資料形式: Tensorboard可以記錄與展示以下資料形式: 標量Scalars; 圖片Images; 音訊Audio; 計算圖Graph; 資料分佈Distribution; 嵌入向量Embedding
spring註解工具類AnnotatedElementUtils和AnnotationUtils
一、前言 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操作工具類pdo和mysqli
從php7開始mysql擴充套件庫已經被全面移除,原因暫不清楚,官方推薦我們使用mysqli和pdo,這次就針對pdo和mysqli分享下我的兩個工具類 1 PDO的mysql操作工具類 這種方式已經用的越來越多了,pdo使用面向物件的方式操作資料庫,pdo是很多人都比較
Android UI優化—GPU過度繪製檢測工具的介紹和使用
GPU過度繪製 指螢幕上的一個畫素被繪製多次(超過一次) 如下圖 GPU過渡繪製監測工具使用方式 GPU過渡繪製監測工具的作用如下: 1、找出應用中哪些地方存在不必要的渲染 2、幫助開發者發現哪些地方可以減少渲染,提高程式執行效率 開啟方式如下: 設定-開發者選項-除錯
多執行緒學習筆記六之併發工具類CountDownLatch和CyclicBarrier
目錄 簡介 CountDownLatch 示例 實現分析 CountDownLatch與Thread.join() CyclicBarrier 實現分析 CountDownLatch和CyclicBarrier區別 簡介
Apache Commons 工具類介紹
//官方示例 public class PoolingDataSources { public static void main(String[] args) { System.out.println("載入jdbc驅動");
Netty原始碼分析第8章(高效能工具類FastThreadLocal和Recycler)---->第1節: FastThreadLocal的使用和建立
Netty原始碼分析第八章: 高效能工具類FastThreadLocal和Recycler 概述: FastThreadLocal我們在剖析堆外記憶體分配的時候簡單介紹過, 它類似於JDK的T
Netty原始碼分析第8章(高效能工具類FastThreadLocal和Recycler)---->第2節: FastThreadLocal的set方法
Netty原始碼分析第八章: 高效能工具類FastThreadLocal和Recycler 第二節: FastThreadLocal的set方法 上一小節我們學習了FastThreadLocal的建立和get方法的實現邏輯, 這一小節學習
Netty原始碼分析第8章(高效能工具類FastThreadLocal和Recycler)---->第5節: 同線程回收物件
Netty原始碼分析第八章: 高效能工具類FastThreadLocal和Recycler 第五節: 同線程回收物件 上一小節剖析了從recycler中獲取一個物件, 這一小節分析在建立和回收是同線程的前提下, recycler是如何進行回收的
Netty原始碼分析第8章(高效能工具類FastThreadLocal和Recycler)---->第6節: 異執行緒回收物件
Netty原始碼分析第八章: 高效能工具類FastThreadLocal和Recycler 第六節: 異執行緒回收物件 異執行緒回收物件, 就是建立物件和回收物件不在同一條執行緒的情況下, 物件回收的邏輯 我們之前小節簡單介紹過, 異執行緒回收物