目前Google Guava在實際應用中非常廣泛,本篇博客將以博主對Guava使用的認識以及在專案中的經驗來給大家分享!正如標題所言,學習使用Google Guava可以讓你快樂編程,寫出優雅的JAVA代碼!
以面向物件思想處理字串:Joiner/Splitter/CharMatcher
JDK提供的String還不夠好么?
也許還不夠友好,至少讓我們用起來還不夠爽,還得操心!
舉個栗子,比如String提供的split方法,我們得關心空字串吧,還得考慮回傳的結果中存在null元素吧,只提供了前后trim的方法(如果我想對中間元素進行trim呢),
那么,看下面的代碼示例,guava讓你不必在操心這些:
uploading-image-224948.png

Joiner/Splitter
Joiner是連接器,Splitter是分割器,通常我們會把它們定義為static final,利用on生成物件后在應用到String進行處理,這是可以復用的,要知道apache commons StringUtils提供的都是static method,
更加重要的是,guava提供的Joiner/Splitter是經過充分測驗,它的穩定性和效率要比apache高出不少,這個你可以自行測驗下~
推薦閱讀:試試 StringJoiner,真香!
發現沒有我們想對String做什么操作,就是生成自己定制化的Joiner/Splitter,多么直白,簡單,流暢的API!
對于Joiner,常用的方法是 跳過NULL元素:skipNulls() / 對于NULL元素使用其他替代:useForNull(String)
對于Splitter,常用的方法是:trimResults()/omitEmptyStrings(),注意拆分的方式,有字串,還有正則,還有固定長度分割(太貼心了!)
其實除了Joiner/Splitter外,guava還提供了字串匹配器:CharMatcher

CharMatcher
CharMatcher,將字符的匹配和處理解耦,并提供豐富的方法供你使用!
對基本型別進行支持
guava對JDK提供的原生型別操作進行了擴展,使得功能更加強大!

Ints
guava提供了Bytes/Shorts/Ints/Iongs/Floats/Doubles/Chars/Booleans這些基本資料型別的擴展支持,只有你想不到的,沒有它沒有的!
對JDK集合的有效補充
灰色地帶:Multiset
JDK的集合,提供了有序且可以重復的List,無序且不可以重復的Set,那這里其實對于集合涉及到了2個概念,一個order,一個dups,那么List vs Set,and then some ?

Multiset
Multiset是什么,我想上面的圖,你應該了解它的概念了,Multiset就是無序的,但是可以重復的集合,它就是游離在List/Set之間的“灰色地帶”!(至于有序的,不允許重復的集合嘛,guava還沒有提供,當然在未來應該會提供UniqueList,我猜的,哈哈)
來看一個Multiset的示例:

Multiset Code
Multiset自帶一個有用的功能,就是可以跟蹤每個物件的數量,
Immutable vs unmodifiable
來我們先看一個unmodifiable的例子:

unmodifiable
你看到JDK提供的unmodifiable的缺陷了嗎?Java集合系列面試題我都整理好了,關注公眾號Java技術堆疊回復 “面試” 獲取,
實際上,Collections.unmodifiableXxx所回傳的集合和源集合是同一個物件,只不過可以對集合做出改變的API都被override,會拋出UnsupportedOperationException,
也即是說我們改變源集合,導致不可變視圖(unmodifiable View)也會發生變化,oh my god!
當然,在不使用guava的情況下,我們是怎么避免上面的問題的呢?

defensive copies
上面揭示了一個概念:Defensive Copies,保護性拷貝,
OK,unmodifiable看上去沒有問題呢,但是guava依然覺得可以改進,于是提出了Immutable的概念,來看:

Immutable
就一個copyOf,你不會忘記,如此cheap~
用Google官方的說法是:we’re using just one class,just say exactly what we mean,很了不起嗎(不僅僅是個概念,Immutable在COPY階段還考慮了執行緒的并發性等,很智能的!),O(∩_∩)O哈哈~
guava提供了很多Immutable集合,比如ImmutableList/ImmutableSet/ImmutableSortedSet/ImmutableMap/…
看一個ImmutableMap的例子:

ImmutableMap
可不可以一對多:Multimap
JDK提供給我們的Map是一個鍵,一個值,一對一的,那么在實際開發中,顯然存在一個KEY多個VALUE的情況(比如一個分類下的書本),我們往往這樣表達:Map<k,List>,好像有點臃腫!臃腫也就算了,更加不爽的事,我們還得判斷KEY是否存在來決定是否new 一個LIST出來,有點麻煩!更加麻煩的事情還在后頭,比如遍歷,比如洗掉,so hard…
來看guava如何替你解決這個大麻煩的:

Multimap
友情提示下,guava所有的集合都有create方法,這樣的好處在于簡單,而且我們不必在重復泛型資訊了,
get()/keys()/keySet()/values()/entries()/asMap()都是非常有用的回傳view collection的方法,
Multimap的實作類有:ArrayListMultimap/HashMultimap/LinkedHashMultimap/TreeMultimap/ImmutableMultimap/…
可不可以雙向:BiMap
JDK提供的MAP讓我們可以find value by key,那么能不能通過find key by value呢,能不能KEY和VALUE都是唯一的呢,這是一個雙向的概念,即forward+backward,
在實際場景中有這樣的需求嗎?比如通過用戶ID找到mail,也需要通過mail找回用戶名,沒有guava的時候,我們需要create forward map AND create backward map,and now just let guava do that for you.

BiMap
biMap / biMap.inverse() / biMap.inverse().inverse() 它們是什么關系呢?
你可以稍微看一下BiMap的原始碼實作,實際上,當你創建BiMap的時候,在內部維護了2個map,一個forward map,一個backward map,并且設定了它們之間的關系,
因此,biMap.inverse() != biMap ;biMap.inverse().inverse() == biMap
可不可以多個KEY:Table
我們知道資料庫除了主鍵外,還提供了復合索引,而且實際中這樣的多級關系查找也是比較多的,當然我們可以利用嵌套的Map來實作:Map<k1,Map<k2,v2>>,為了讓我們的代碼看起來不那么丑陋,guava為我們提供了Table,

Table
Table涉及到3個概念:rowKey,columnKey,value,并提供了多種視圖以及操作方法讓你更加輕松的處理多個KEY的場景,
函式式編程:Functions

Functions
上面的代碼是為了完成將List集合中的元素,先截取5個長度,然后轉成大寫,
函式式編程的好處在于在集合遍歷操作中提供自定義Function的操作,比如transform轉換,我們再也不需要一遍遍的遍歷集合,顯著的簡化了代碼!

對集合的transform操作可以通過Function完成
斷言:Predicate

Predicate最常用的功能就是運用在集合的過濾當中!

filter
需要注意的是Lists并沒有提供filter方法,不過你可以使用Collections2.filter完成!推薦閱讀:Java 中初始化 List 集合的 6 種方式,
check null and other:Optional、Preconditions
在guava中,對于null的處理手段是快速失敗,你可以看看guava的原始碼,很多方法的第一行就是:Preconditions.checkNotNull(elements);
要知道null是模糊的概念,是成功呢,還是失敗呢,還是別的什么含義呢?

Preconditions/Optional
Cache is king
對于大多數互聯網專案而言,快取的重要性,不言而喻!
如果我們的應用系統,并不想使用一些第三方快取組件(如redis),我們僅僅想在本地有一個功能足夠強大的快取,很可惜JDK提供的那些SET/MAP還不行!

CacheLoader
首先,這是一個本地快取,guava提供的cache是一個簡潔、高效,易于維護的,為什么這么說呢?因為并沒有一個單獨的執行緒用于重繪 OR 清理cache,對于cache的操作,都是通過訪問/讀寫帶來的,也就是說在讀寫中完成快取的重繪操作!
其次,我們看到了,我們非常通俗的告訴cache,我們的快取策略是什么,SO EASY!在如此簡單的背后,是guava幫助我們做了很多事情,比如執行緒安全,
讓異步回呼更加簡單
JDK中提供了Future/FutureTask/Callable來對異步回呼進行支持,但是還是看上去挺復雜的,能不能更加簡單呢?比如注冊一個監聽回呼,

異步回呼
我們可以通過guava對JDK提供的執行緒池進行裝飾,讓其具有異步回呼監聽功能,然后在設定監聽器即可!
Summary
到這里,這篇文章也只介紹了guava的冰山一角,其實還有很多內容:

guava package
比如反射、注解、網路、并發、IO等等
好了,希望這篇文章讓你快速進階,快樂編程!
作者:張豐哲
出處:www.jianshu.com/p/97778b21bd00
總結了一些2020年的面試題,這份面試題的包含的模塊分為19個模塊,分別是: Java 基礎、容器、多執行緒、反射、物件拷貝、Java Web 、例外、網路、設計模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM ,

獲取資料以上資料:關注公眾號:有故事的程式員,獲取學習資料,
記得點個關注+評論哦~uploading-image-120003.png
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/238329.html
標籤:Java
上一篇:精盡Spring MVC原始碼分析 - HandlerAdapter 組件(五)之 HttpMessageConverter
