為什麼強烈推薦 Java 程式設計師使用 Google Guava 編程?

2021-03-02 程式設計師內參

(點擊上方公眾號,可快速關注)

目前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高出不少,這個你可以自行測試下~

發現沒有我們想對String做什麼操作,就是生成自己定製化的Joiner/Splitter,多麼直白,簡單,流暢的API!

對於Joiner,常用的方法是  跳過NULL元素:skipNulls()  /  對於NULL元素使用其他替代:useForNull(String)

對於Splitter,常用的方法是:trimResults()/omitEmptyStrings()。注意拆分的方式,有字符串,還有正則,還有固定長度分割(太貼心了!)

其實除了Joiner/Splitter外,guava還提供了字符串匹配器:


CharMatcher



CharMatcher


CharMatcher,將字符的匹配和處理解耦,並提供豐富的方法供你使用!


對基本類型進行支持

guava對JDK提供的原生類型操作進行了擴展,使得功能更加強大!




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就是無序的,但是可以重複的集合,它就是游離在List/Set之間的「灰色地帶」!

(至於有序的,不允許重複的集合嘛,guava還沒有提供,當然在未來應該會提供UniqueList,我猜的,哈哈)

來看一個Multiset的示例:



Multiset自帶一個有用的功能,就是可以跟蹤每個對象的數量。


Immutable vs unmodifiable

來我們先看一個unmodifiable的例子:



你看到JDK提供的unmodifiable的缺陷了嗎?

實際上,Collections.unmodifiableXxx所返回的集合和源集合是同一個對象,只不過可以對集合做出改變的API都被override,會拋出UnsupportedOperationException。

也即是說我們改變源集合,導致不可變視圖(unmodifiable View)也會發生變化,oh my god!

當然,在不使用guava的情況下,我們是怎麼避免上面的問題的呢?



上面揭示了一個概念:Defensive Copies,保護性拷貝。


OK,unmodifiable看上去沒有問題呢,但是guava依然覺得可以改進,於是提出了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的例子:


可不可以一對多:Multimap

JDK提供給我們的Map是一個鍵,一個值,一對一的,那麼在實際開發中,顯然存在一個KEY多個VALUE的情況(比如一個分類下的書本),我們往往這樣表達:Map<k,List>,好像有點臃腫!

臃腫也就算了,更加不爽的事,我們還得判斷KEY是否存在來決定是否new 一個LIST出來,有點麻煩!更加麻煩的事情還在後頭,比如遍歷,比如刪除,so hard.

來看guava如何替你解決這個大麻煩的:



**友情提示下,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.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涉及到3個概念:rowKey,columnKey,value,並提供了多種視圖以及操作方法讓你更加輕鬆的處理多個KEY的場景。

函數式編程:Functions

上面的代碼是為了完成將List集合中的元素,先截取5個長度,然後轉成大寫。

函數式編程的好處在於在集合遍歷操作中提供自定義Function的操作,比如transform轉換。我們再也不需要一遍遍的遍歷集合,顯著的簡化了代碼!


對集合的transform操作可以通過Function完成


斷言:Predicate

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


需要注意的是Lists並沒有提供filter方法,不過你可以使用Collections2.filter完成!

check null and other:Optional、Preconditions

在guava中,對於null的處理手段是快速失敗,你可以看看guava的源碼,很多方法的第一行就是:Preconditions.checkNotNull(elements);


要知道null是模糊的概念,是成功呢,還是失敗呢,還是別的什麼含義呢?


Cache is king

對於大多數網際網路項目而言,緩存的重要性,不言而喻!

如果我們的應用系統,並不想使用一些第三方緩存組件(如redis),我們僅僅想在本地有一個功能足夠強大的緩存,很可惜JDK提供的那些SET/MAP還不行!


首先,這是一個本地緩存,guava提供的cache是一個簡潔、高效,易於維護的。

為什麼這麼說呢?因為並沒有一個單獨的線程用於刷新 OR 清理cache,對於cache的操作,都是通過訪問/讀寫帶來的,也就是說在讀寫中完成緩存的刷新操作!

其次,我們看到了,我們非常通俗的告訴cache,我們的緩存策略是什麼,SO EASY!

在如此簡單的背後,是guava幫助我們做了很多事情,比如線程安全。

讓異步回調更加簡單

JDK中提供了Future/FutureTask/Callable來對異步回調進行支持,但是還是看上去挺複雜的,能不能更加簡單呢?

比如註冊一個監聽回調。


我們可以通過guava對JDK提供的線程池進行裝飾,讓其具有異步回調監聽功能,然後在設置監聽器即可!

Summary

到這裡,這篇文章也只介紹了guava的冰山一角,其實還有很多內容:



比如反射、註解、網絡、並發、IO等等

好了,希望這篇文章讓你快速進階,快樂編程!

相關焦點

  • 為什麼強烈推薦 Java 程式設計師使用 Google Guava 編程!
    目前Google Guava在實際應用中非常廣泛,本篇博客將以博主對Guava使用的認識以及在項目中的經驗來給大家分享!正如標題所言,學習使用Google Guava可以讓你快樂編程,寫出優雅的JAVA代碼!
  • 為什麼推薦 Java 程式設計師使用 Google Guava 編程?
    學習使用 Google Guava可以讓你快樂編程,寫出優雅的 Java 代碼,在業務允許的條件下,我推薦使用 Guava編程!Joiner/Splitter/CharMatcher也許還不夠友好,至少讓我們用起來還不夠爽,還得操心!
  • 使用 Google Guava 快樂編程
    目前Google Guava在實際應用中非常廣泛,本篇博客將以博主對Guava使用的認識以及在項目中的經驗來給大家分享!正如標題所言,學習使用Google Guava可以讓你快樂編程,寫出優雅的JAVA代碼!
  • Google程式設計師使用的頂級程式語言
    他們透露了一些關於谷歌內部使用的語言的信息。以下是其中一些: 1. C++谷歌最優先考慮的事情之一就是性能。c++是一種理想的程式語言,可用於一次處理多個伺服器。同時google也看中了c++高度可移植性。這意味著它可以在不同的平臺和設備上使用。c++的多功能性可能是谷歌使用它的另一個原因。
  • Guava 18 正式版發布,來自 Google 的 Java 類庫
    Guava 18 正式版發布,此版本解決了 16 個 isuues,同時還有很多 API 改進:common.baseMoreObjectsMethods in Objects which do not have equivalents in java.util.Objects
  • Google Guava,牛逼的腳手架
    這麼說吧,學好如何使用我,能讓你在編程中變得更快樂,寫出更優雅的代碼!02、引入 Guava如果你要在 Maven 項目使用我的話,需要先在 pom.xml 文件中引入我的依賴。<dependency>    <groupId>com.google.guava</groupId>    <artifactId>guava</artifactId>    <version>30.1-jre</version>
  • Google 出品 Java 編碼規範,強烈推薦!
    /styleguide/javaguide.html這是:Google Python 編碼規範,Google官方的Java編程風格規範。《Google 出品 Python 編碼規範,強烈推薦!》。也就是說,雖然示例代碼是遵循Google編程風格,但並不意味著這是展現這些代碼的唯一方式。示例中的格式選擇不應該被強制定為規則。源文件基礎2.1 文件名源文件以其最頂層的類名來命名,大小寫敏感,文件擴展名為 .java。
  • Google 出品的 Java 編碼規範,強烈推薦,權威又科學!
    譯者丨Hawsteinhawstein.com/2014/01/20/google-java-style/這份文檔是Google Java編程風格規範的完整定義。若且唯若一個Java源文件符合此文檔中的規則, 我們才認為它符合Google的Java編程風格。
  • guava並發工具
    並發是一個難題,但是可以通過使用強力簡單的抽象來顯著的簡化,為了簡化問題,guava擴展了Future接口,即 ListenableFuture
  • Guava Cache實戰
    GuavaCache是google開源java類庫Guava的其中一個模塊,使用起來和ConcurrentHashMap一樣,簡單、強大、及輕量級。Guava Cache工作方式GuavaCache的工作流程:獲取數據->如果存在,返回數據->計算獲取數據->存儲返回。
  • Google 開源的 Guava 工具庫,太強大了~
    目前Google Guava在實際應用中非常廣泛,本篇博客將以博主對Guava使用的認識以及在項目中的經驗來給大家分享!正如標題所言,學習使用Google Guava可以讓你快樂編程,寫出優雅的JAVA代碼!
  • 為什麼程式設計師都不願意升級 Java 8?
    這是為什麼呢?一起來看。那麼,鑑於這些因素,為什麼從Java 9開始每年兩次發布新版本的情況下,開發人員還在堅持使用Java 8呢?目前Java最新的版本是Java 12,然而很少有人使用9~12的版本。估計你能猜到這其中的原因:「很複雜」。Java 8之後的版本發生了很多變化,這可能會導致各個公司在Java升級上舉棋不定。
  • java retry(重試) spring retry, guava retrying 詳解
    設計思路springjava 註解註解可在方法上使用,定義需要重試的次數攔截指定需要重試的方法,解析對應的重試次數,然後進行對應次數的重試。你可以看下 guava-retry,我很久以前用過,感覺還不錯。小明:好的。guava-retrying](mailto:br/>和返回與@Retryable方法相同的類型的值。<br/)guava-retrying 模塊提供了一種通用方法, 可以使用Guava謂詞匹配增強的特定停止、重試和異常處理功能來重試任意Java代碼。
  • 程式設計師加班多原因之一重複造輪子,推薦學習谷歌利器Guava
    https://mp.weixin.qq.com/s/MN5izdBSYaDUtn6P53ostA吐槽程式設計師天天重複造輪子("碼農");names.add("工程師");names.add(null);names.add("");字符拼接String namesStr=Joiner.on(",").skipNulls().join(names);System.out.println("字符拼接工具之guava
  • 為 Java 程式設計師而生的 10 + 最佳庫
    (點擊上方公眾號,可快速關注)來源:開源中國,www.oschina.net/translate/useful-java-libraries-for-java-programmers
  • 為 Java 程式設計師而生的 10+ 最佳庫
    (點擊上方公眾號,可快速關注)來源:開源中國,www.oschina.net/translate/useful-java-libraries-for-java-programmers
  • Google Java編程風格指南
    /posts/google-java-style.html前言這份文檔是Google Java編程風格規範的完整定義。也就是說,雖然示例代碼是遵循Google編程風格,但並不意味著這是展現這些代碼的唯一方式。示例中的格式選擇不應該被強制定為規則。源文件基礎2.1 文件名源文件以其最頂層的類名來命名,大小寫敏感,文件擴展名為.java。
  • Java 程式設計師必讀的 9 本書
    來自:程式設計師書庫(ID:CodingBook)
  • JAVA程式設計師一定知道的優秀第三方庫(2016版)
    ,但我合作過的一些國外JAVA工程師幾乎都會推薦這個JAVA庫。添加下面的引用,在Maven項目中加入這個庫<dependency>  <groupId>com.google.guava</groupId>  <artifactId>guava</artifactId>  <version>19.0</version></dependency>
  • Java工程師成神之路~
    Java序列化java.io. Serializable什麼是序列化,為什麼序列化序列化與單例模式google序列化protobuf1.2.9. 虛引用,弱引用,軟引用java.lang.ref.*實驗這些引用的回收1.2.10.