通過使用guava庫,讓代碼簡潔易擴展。
1、條件檢查
業(yè)務(wù)代碼書寫過程中,各種判空和參數(shù)檢查是不可避免的,重復(fù)繁瑣的代碼讓項目顯得臃腫丑陋。所以我們可以借用guava封裝前置條件檢查的函數(shù),下面介紹兩個最常用的方法。
checkArgument(boolean) 檢查boolean是否為true,用來檢查傳遞給方法的參數(shù)
checkNotNull(T) 檢查value是否為null,該方法返回value,可內(nèi)嵌使用。
2、排序器
Ordering是Guava最常用的Comparator類,比comparator更易擴展。
A Ordering的新建
Order<String> natural = Ordering.natural(); //使用自然順序, 例如:整數(shù)從小到大,字符串是按字典順序
Order<String> usingToString = Ordering.usingToString(); //使用toString()返回的字符串按字典順序進行排序
Ordering byLengthOrdering =new Ordering() {@Override public intcompare(@NullableString s,@NullableString t1) {returnInts.compare(s.length(),t1.length());}}; //自定義排序規(guī)則
B Ordering的使用
reverse() //相反的排序
isOrdered(Collection<T> c) //是否是有序的
sortedCopy(Collection<T> c) //返回排序好的隊列
3、集合
集合類的封裝,不再需要繁瑣的編碼方式。
A 不可變集合
ImmutableSet/ImmutableList/ImmutableMap //不可變
ImmutableSortedSet //自動排序
ImmutableMultiset //可以重復(fù),可以統(tǒng)計某個值在 set集合中有多少個
B 特殊集合
BiMap //雙向Map,可以通過reverse()反轉(zhuǎn)key-value
MultiMap //value可為一個list
RangeMap //描述了”不相交的、非空的區(qū)間”到特定值的映射,不合并相鄰的區(qū)間
Forwarding //裝飾器,類繼承ForwardingXXX,可以重新方法add/delegate等方法
4、緩存 Guava Cache
cache是線程安全的,類似于concurrentMap,但是內(nèi)部封裝更多的方法
http://ifeve.com/google-guava-cachesexplained/
5、函數(shù)式編程
重點學習的部分,將繁瑣的代碼簡化。函數(shù)式編程最常見的就是用于集合的轉(zhuǎn)換和過濾。
A list值轉(zhuǎn)換

B list轉(zhuǎn)換為map

C 過濾 predicate

6、guava的并發(fā)編程
重點是ListenableFuture,ListenableFuture可以監(jiān)控Future是否執(zhí)行完成。Future的計算是異步的,但是獲取結(jié)果在主線程中,是會阻塞主線程的。但是如果通過ListenableFuture,那么獲取結(jié)果也是新開線程,并不阻塞主線程。適用的場景是多個任務(wù)并發(fā)計算,某個任務(wù)的計算時間特別長。舉例如下
A 直接在主線程獲取結(jié)果并處理,耗時512ms

B 使用ListenableFuture,耗時14ms
