Google 開源的 Guava 工具庫,太強大了~

2021-02-20 我是程序汪

目前Google Guava在實際應用中非常廣泛,本篇博客將以博主對Guava使用的認識以及在項目中的經驗來給大家分享!正如標題所言,學習使用Google Guava可以讓你快樂編程,寫出優雅的JAVA代碼!

以面向對象思想處理字符串:Joiner/Splitter/CharMatcher

JDK提供的String還不夠好麼?

也許還不夠友好,至少讓我們用起來還不夠爽,還得操心!

舉個慄子,比如String提供的split方法,我們得關心空字符串吧,還得考慮返回的結果中存在null元素吧,只提供了前後trim的方法(如果我想對中間元素進行trim呢)。

那麼,看下面的代碼示例,guava讓你不必在操心這些:

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<v>>,好像有點臃腫!臃腫也就算了,更加不爽的事,我們還得判斷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的場景。

函數式編程:FunctionsFunctions

上面的代碼是為了完成將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/OptionalCache 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等等

相關焦點

  • Google 開源工具庫,太強大了~
    注意拆分的方式,有字符串,還有正則,還有固定長度分割(太貼心了!)其實除了Joiner/Splitter外,guava還提供了字符串匹配器:CharMatcher# 對基本類型進行支持guava對JDK提供的原生類型操作進行了擴展,使得功能更加強大!
  • Guava 23.3 版本發布,Google 的 Java 核心庫
    Guava 23.3 已發布,Guava 是 Google 的一個開源項目,包含許多 Google 核心的 Java 常用庫,如:集合 [collections] 、緩存 [caching]
  • 使用 Google Guava 快樂編程
    注意拆分的方式,有字符串,還有正則,還有固定長度分割(太貼心了!)其實除了Joiner/Splitter外,guava還提供了字符串匹配器:CharMatcher對基本類型進行支持guava對JDK提供的原生類型操作進行了擴展,使得功能更加強大!
  • 為什麼強烈推薦 Java 程式設計師使用 Google Guava 編程!
    注意拆分的方式,有字符串,還有正則,還有固定長度分割(太貼心了!)其實除了Joiner/Splitter外,guava還提供了字符串匹配器:CharMatcher對基本類型進行支持guava對JDK提供的原生類型操作進行了擴展,使得功能更加強大!
  • 開源巨獻:Google最熱門60款開源項目
    (詳情:https://github.com/google/guava)7、Spark  ★Star 13378(詳情:https://github.com/google/leveldb)11、自動化網絡審查工具 Lighthouse  ★Star 9400Lighthouse 是一個開源的自動化工具,用於改進網絡應用的質量。
  • 開源巨獻:五十多款Google最熱門開源項目
    詳情:https://github.com/google/guava7、Spark  ★Star 13378Project Magenta使用了 TensorFlow系統,研究人員在GitHub上開源了他們的模型和工具。
  • Guava - 拯救垃圾代碼,寫出優雅高效,效率提升N倍
    最近在看一個同學代碼的時候,發現代碼中大量使用了 Google 開源的 Guava 核心庫中的內容,讓代碼簡單清晰了不少,故學習分享出 Guava 中我認為最實用的功能。-- https://mvnrepository.com/artifact/com.google.guava/guava --><dependency>    <groupId>com.google.guava</groupId>    <artifactId>guava</artifactId>
  • 美觀又實用,10款強大的開源Javascript圖表庫
    以下是為開發者推薦的 10 款開源 Javascript 圖表庫,可以幫助實現各種漂亮的功能。話不多說,直接開始吧!Chart.js 是一個簡單、面向對象、為設計者和開發者準備的 Javascript 圖表繪製工具庫,基於 HTML5 canvas 技術,支持所有現代瀏覽器,並且針對 IE7/8 提供了降級替代方案。
  • Google 開源的 Android 排版庫:FlexboxLayout
    最近Google開源了一個項目叫你可以簡單的理解為 Flexbox 是CSS領域類似 Linearlayout 的一種布局,但是要比 Linearlayout 要強大的多剛才說了 Flexbox 是CSS領域的比較強大的一個布局
  • ahooks 正式發布:值得擁抱的 React Hooks 工具庫
    正當方案確定準備開發時,在 ice/hooks RFC 評論區收到來自螞蟻 umi 團隊 #盡龍 的回覆,希望可以共建維護一套阿里集團通用的 Hooks 方案,經過幾輪討論下來為避免重複建設,以及共同訴求的前提下,與螞蟻 umi 團隊,阿里體育團隊達成共建 React Hooks 工具庫的目標
  • GitHub上非常實用的40個開源JAVA項目
    GitHub:http://h5ip.cn/BPju11.hankcs/HanLP:強大的自然語言處理、中文分詞庫,國人開發。GitHub:http://h5ip.cn/oWUs12.atomashpolskiy/bt:Java種子下載程序(我什麼都不知道啊)。
  • Google 開源 iOS 應用測試工具:EarlGrey
    Google於今日宣布了開源的EarlGrey軟體,以便開發者更輕鬆地構建和運行「面向iOS apps源碼」的用戶界面測試(是的
  • Google用著不爽的幾點
    強大易用的gmail,簡潔的gtalk,方便的google reader,支持外鏈的picasa網絡相冊,可以方便和獨立博客博主交流的friend concent,更專業的google網上論壇,可以用來了解自己博客的google網站管理員工具,當然還有能給自己的博客帶來收入的google adsense,都讓我越來越喜歡google,百度用的越來越少。
  • 百度開源平臺上線,聚合百度開源項目
    百度公司近日上線「百度開源平臺」,該平臺主要用來展示百度的開源項目。 可用來個性化定製數據可視化圖表 ESUI:一套簡單的UI Library,提供一系列的控制項,能滿足基本頁面交互功能 F.I.S: 全稱為Front-end Integrated Solution,一套完整的前端技術解決方案,包括前段框架、模板框架、自動化框架以及輔助開發工具 EDP:一個企業級前端應用的開發平臺 EST:一個基於LESS的樣式工具庫
  • [開源推薦]Google開源基於Deep Learning的word2vec工具
    word2vec為計算向量詞提供了一種有效的連續詞袋(bag-of-words)和skip-gram架構實現,word2vec遵循Apache License 2.0開源協議。如何轉換?word2vec主要是將文本語料庫轉換成詞向量。
  • 山寨泛濫 Google play誤封正版開源BT客戶端LibreTorrent
    Yaroslav Pronin,安卓開源 BT 客戶端 LibreTorrent 的開發者,在上個月的一天早上,發現自己的應用被 Google play 商店毫無預兆地下架了。與此同時,他收到一封來自 Google 的電子郵件,Google 將 LibreTorrent 標記為「垃圾軟體」(非原創),並告知由於違反政策,應用已被刪除。
  • java retry(重試) spring retry, guava retrying 詳解
    CGLIB 是一個功能強大、高性能和高質量的代碼生成庫,用於擴展JAVA類並在運行時實現接口。javassist (Java編程助手)使Java字節碼操作變得簡單。它是Java中編輯字節碼的類庫;它允許Java程序在運行時定義新類,並在JVM加載類文件時修改類文件。
  • 一貼讓你玩轉GuavaPass | How to use GuavaPass
    註冊與購買課程方案How to register on GuavaPass and purchaseyour membership首先登陸GuavaPass中文官網guavapass.cnYou can register for a Guavapass accont using your WeChat account or e-mail address at guavapass.cn (Copy and paste the link on your browser or open it through 'Read More』 at the end
  • 開源數據可視化工具資源整合
    /index.php/Main_Page/18 Google Chart Tools類型: 庫技術: JavaScript開源協議: Free to use資源連結主頁:https://developers.google.com/chart/案例:https
  • Google的開源Consent解決方案解析【APUS研究院|GDPR實戰指南(六...
    請求樣例:正常請求:https://adservice.google.com/getconfig/pubvendors?pubs=pub-XXXXXX&es=2&plat=android&v=1.0.6調試直接當成歐洲用戶請求:https://adservice.google.com/getconfig/pubvendors?