自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

老司機阿粉帶你玩轉(zhuǎn) Guava 集合類

開發(fā) 后端
這篇文章阿粉帶大家學(xué)習(xí)開源工具 Guava 集合的相關(guān)類使用方法,日常開發(fā)中我們善于使用這些工具類,不要自己重復(fù)造輪子。

 日常開發(fā)中,阿粉經(jīng)常需要用到 Java 提供集合類完成各種需求。Java 集合類雖然非常強大實用,但是提供功能還是有點薄弱。

舉個例子,阿粉最近接到一個需求,從輸入一個文檔中,統(tǒng)計一個關(guān)鍵詞出現(xiàn)的次數(shù)。代碼如下:

 

 

 

 

雖然這個需求使用 Map 可以輕松搞定,但是阿粉還是覺得這種寫法有點笨拙,如果沒有判空,將會導(dǎo)致 NPE 異常。

如果很多地方需要功能,我們就可以抽象出來,將其封裝成工具類。

不過上面的功能大家就不需要自己封裝,一款來自 Google 開源工具類-Guava,可以輕松的解決上面的統(tǒng)計問題。

Guava 介紹

Guava 是一款 Google 開源工具類,包含許多 Google 內(nèi)部 Java 項目依賴的核心類。Guava 擴展 Java 基礎(chǔ)類工程,比如集合,并發(fā)等,也增加一些其他強大功能,比如緩存,限流等功能。

另外 Guava 推出一些類,如 Optional,甚至被 Java 開發(fā)者學(xué)習(xí),后續(xù)增加到 JDK 中。

目前 Guava Github 倉庫已有 36k star,可以見到 Guava 受歡迎程度。

 

 

 

 

Guava 核心功能包括多個模塊,今天阿粉主要帶大家玩轉(zhuǎn) Guava 集合類。

擴展集合類

Guava 創(chuàng)造很多 JDK 沒有,但是我們?nèi)粘s明顯有用的新集合類型。這些新類型使用 JDK 集合接口規(guī)范,所以使用方法與 JDK 集合框架差不多,并沒有增加很多使用難度。

Multiset

阿粉第一次見到 Multiset 這個類,還以為是 Set 接口子類。實際上此『Set』,僅僅只是數(shù)學(xué)上集合概念。

Multiset 繼承 JDK Collection 接口,我們可以多次增加相同的元素,另外Multiset 最大特定將會為元素計數(shù),我們可以將它類似等同為 Map

使用 Multiset可以輕松解決開頭的問題。

 

 

 

 

使用 Multiset 簡化了代碼,并且再也不用擔(dān)心新 NPE 的問題。

跟 JDK 集合類一樣,Multiset也有許多子類。

 

 

來源于 Github

 

 

這里阿粉提醒一下大家,雖然上面說過我們可以將 Multiset 看做 Map

Multimap

阿粉有時會在業(yè)務(wù)需求中使用 Map

1a->[1,2,3] b->4,c->[6,5]

使用 Map + List 這種結(jié)構(gòu)比較笨拙,并且代碼實現(xiàn)也比較繁瑣。Multimap 正式 Guava 中解決這種問題的新出的一個雷。

使用 Multimap 實現(xiàn)代碼如下:

 

 

 

 

這里阿粉使用 Multimap 子類 HashMultimap,其行為類似為 Map

Multimap還有其他子類,如圖所示:

 

 

來源于 Github

 

 

BiMap

BiMap 可以用來實現(xiàn)鍵值對的雙向映射需求,這樣我們就可以通過 Key 查找對對應(yīng)的Value,也可以使用 Value 查找對應(yīng)的 Key。

這個需求如果使用 Map 實現(xiàn),我們就不得不使用兩個 Map,維護雙向關(guān)系,并且任何改動還要保持同步。

 

 

 

 

使用 BiMap 修改上面的代碼:

 

 

 

 

這里需要注意,BiMap#put方法不能加入重復(fù)元素, 若加入,將會拋錯。如果若特定值一定要替換,可以使用 BiMap#forcePut代替。

敲黑板,這個知識點記下來。阿粉使用過程中,就踩過這個坑。

同樣的 BiMap 也有各種實現(xiàn)類:

 

 

來源于 Github

 

 

其他擴展集合類

Guava 另外還提供其他集合類,不過這些類使用起來有點復(fù)雜,阿粉還未在業(yè)務(wù)代碼中使用過,這里簡單提下,感興趣同學(xué)可以深入了解一下。

  • Table
  • ClassToInstanceMap
  • RangeSet
  • RangeMap

集合工具類

除了上面提到的新集合類以外,Guava 提供通用的工具類:

 

 

來源于 Github

 

 

這些工具類需對使用的方法,我們可以快速創(chuàng)建集合,分割集合,轉(zhuǎn)化集合等。

快速創(chuàng)建集合實例

使用工具類,我們可以快速創(chuàng)建集合。例如:

  1. 1List<String> list=Lists.newArrayList(); 
  2. 2Set<String> set=Sets.newHashSet(); 
  3. 3Map<String,String> map=Maps.newHashMap(); 

相比于 new 集合方法,Guava 方法創(chuàng)建方式更加簡單。

  1. 1List<String> list=new ArrayList<String>(); 
  2. 2Set<String> set=new HashSet<String>(); 
  3. 3Map<String,String> map=new HashMap<String, String>(); 

Guava 工具類智能推導(dǎo) List 泛型,再也不用兩側(cè)都重復(fù)寫泛型了。

另外還可以指定集合類的初始化大小。

 

 

 

 

Lists.transform

Lists#transform方法可以替代繁瑣 for 循環(huán),將元素轉(zhuǎn)化,創(chuàng)建一個新集合類。

 

 

 

 

不過使用這個方法我們要注意一點。

Lists#transform 內(nèi)部使用懶加載的機制,只有在調(diào)用獲取的元素的時候,如result.get 才會真正使用 Function 從源 List 獲取元素,做相應(yīng)的轉(zhuǎn)化。每次獲取元素都將會使用 function 進行轉(zhuǎn)化。

所以使用 Lists#transform 得到 List 僅僅只是源 List 一個視圖,任何對源List 的元素修改,都將會被反應(yīng)到創(chuàng)建之后的 List 。任何對創(chuàng)建之后 List 中的元素進行修改,都不會生效。下次再次讀取元素時,將會發(fā)現(xiàn)相應(yīng)修改的丟失了。。。

阿粉之前就踩過這個坑,如果你有這種需求,可以使用以下方式創(chuàng)建一個新集合:

 

 

 

 

JDK8 之前版本,阿粉經(jīng)常使用該方法轉(zhuǎn)化 List 中的元素。不過你如果使用 JDK8,阿粉還是推薦使用 Stream 流式編程。

交集并集差集

Sets 提供幾個方法,可以快速求出兩個 Set 集合的交集,并集以及差集。

不可變集合

不可變(Immutable)集合,顧名思義集合不可以被修改。初始創(chuàng)建不可變集合時嗎,需要傳入數(shù)據(jù)源,創(chuàng)建完成之后,集合就再也不能修改,增加,刪除元素,否則將會報錯。

這是一種防御性策略,防止集合在后續(xù)操作中被修改,從而引發(fā)問題。

不可變集合優(yōu)點在于:

  • 由于不可變集合僅僅只能讀,多線程并發(fā)天然安全
  • 由于不可變集合固定不變,可以將其當(dāng)做常量安全,不用單線其他人修改
  • 不可變集合占用更少內(nèi)存空間
  • 不可變集合不可以被修改,所以不用擔(dān)心其他程序任意修改集合

Guava 不可變集合支持 JDK 所有集合接口:

 

 

 

 

我們可以使用如下幾種方式創(chuàng)建不可變集合,以 ImmutableList 為例:

 

 

 

 

總結(jié)

這篇文章阿粉帶大家學(xué)習(xí)開源工具 Guava 集合的相關(guān)類使用方法,日常開發(fā)中我們善于使用這些工具類,不要自己重復(fù)造輪子。

本篇文章僅僅只是介紹 Guava 一小部分功能,還有很對功能,阿粉也覺得很好用在。這里推薦大家去查看 Guava 官方 wiki,查看具體使用方法。

如果大家還想知道其他開源工具類,給阿粉點個贊,下次給大家?guī)硎趾糜瞄_源工具類~

[[317842]]

 

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2018-07-12 09:59:39

microServicmockautoTest

2020-07-09 07:54:35

ThreadPoolE線程池

2022-12-14 15:16:51

2016-11-28 16:09:37

2017-03-17 15:10:52

微信消息撤回功能

2018-03-07 10:50:46

MySQL分布式存儲

2020-04-02 08:47:04

開發(fā)網(wǎng)站技術(shù)

2018-05-15 16:57:23

程序員

2020-08-25 07:32:42

工具對象 Java

2018-03-14 10:44:34

數(shù)據(jù)庫MySQLMGR

2022-09-01 07:24:30

鴻蒙OSHarmonyOS微內(nèi)核

2020-10-19 07:50:32

Linux命令系統(tǒng)

2020-10-30 07:43:35

Jenkins配置前端

2017-07-17 17:13:58

老司機

2019-09-19 08:17:02

數(shù)據(jù)分析AB

2021-08-19 07:34:55

RabbitMQLinuxWindows

2020-11-09 14:15:23

代碼菜鳥老司機

2017-05-24 10:58:28

linux系統(tǒng)技巧

2021-06-16 09:55:40

程序員開源編程語言

2020-10-19 06:47:05

爬蟲數(shù)據(jù)Jsoup
點贊
收藏

51CTO技術(shù)棧公眾號