通過使用guava庫庶溶,讓代碼簡潔易擴(kuò)展。
1垒棋、條件檢查
業(yè)務(wù)代碼書寫過程中卒煞,各種判空和參數(shù)檢查是不可避免的,重復(fù)繁瑣的代碼讓項(xiàng)目顯得臃腫丑陋叼架。所以我們可以借用guava封裝前置條件檢查的函數(shù)畔裕,下面介紹兩個(gè)最常用的方法衣撬。
checkArgument(boolean) 檢查boolean是否為true,用來檢查傳遞給方法的參數(shù)
checkNotNull(T) 檢查value是否為null扮饶,該方法返回value淮韭,可內(nèi)嵌使用。
2贴届、排序器
Ordering是Guava最常用的Comparator類靠粪,比comparator更易擴(kuò)展。
A Ordering的新建
Order<String> natural = Ordering.natural(); //使用自然順序毫蚓, 例如:整數(shù)從小到大占键,字符串是按字典順序
Order<String> usingToString = Ordering.usingToString(); //使用toString()返回的字符串按字典順序進(jìn)行排序
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) //返回排序好的隊(duì)列
3、集合
集合類的封裝元潘,不再需要繁瑣的編碼方式畔乙。
A 不可變集合
ImmutableSet/ImmutableList/ImmutableMap //不可變
ImmutableSortedSet //自動(dòng)排序
ImmutableMultiset //可以重復(fù),可以統(tǒng)計(jì)某個(gè)值在 set集合中有多少個(gè)
B 特殊集合
BiMap //雙向Map,可以通過reverse()反轉(zhuǎn)key-value
MultiMap //value可為一個(gè)list
RangeMap //描述了”不相交的翩概、非空的區(qū)間”到特定值的映射牲距,不合并相鄰的區(qū)間
Forwarding //裝飾器,類繼承ForwardingXXX钥庇,可以重新方法add/delegate等方法
4牍鞠、緩存 Guava Cache
cache是線程安全的,類似于concurrentMap评姨,但是內(nèi)部封裝更多的方法
http://ifeve.com/google-guava-cachesexplained/
5难述、函數(shù)式編程
重點(diǎn)學(xué)習(xí)的部分,將繁瑣的代碼簡化吐句。函數(shù)式編程最常見的就是用于集合的轉(zhuǎn)換和過濾胁后。
A list值轉(zhuǎn)換
B list轉(zhuǎn)換為map
C 過濾 predicate
6、guava的并發(fā)編程
重點(diǎn)是ListenableFuture嗦枢,ListenableFuture可以監(jiān)控Future是否執(zhí)行完成攀芯。Future的計(jì)算是異步的,但是獲取結(jié)果在主線程中文虏,是會(huì)阻塞主線程的侣诺。但是如果通過ListenableFuture,那么獲取結(jié)果也是新開線程择葡,并不阻塞主線程紧武。適用的場(chǎng)景是多個(gè)任務(wù)并發(fā)計(jì)算剃氧,某個(gè)任務(wù)的計(jì)算時(shí)間特別長敏储。舉例如下