偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

 

 

 

 

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

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

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

Guava 介紹

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

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

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

 

 

 

 

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

擴(kuò)展集合類

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

Multiset

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

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

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

 

 

 

 

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

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

 

 

來源于 Github

 

 

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

Multimap

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

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

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

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

 

 

 

 

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

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

 

 

來源于 Github

 

 

BiMap

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

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

 

 

 

 

使用 BiMap 修改上面的代碼:

 

 

 

 

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

敲黑板,這個(gè)知識(shí)點(diǎn)記下來。阿粉使用過程中,就踩過這個(gè)坑。

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

 

 

來源于 Github

 

 

其他擴(kuò)展集合類

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

  • Table
  • ClassToInstanceMap
  • RangeSet
  • RangeMap

集合工具類

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

 

 

來源于 Github

 

 

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

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

使用工具類,我們可以快速創(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)建一個(gè)新集合類。

 

 

 

 

不過使用這個(gè)方法我們要注意一點(diǎn)。

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

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

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

 

 

 

 

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

交集并集差集

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

不可變集合

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

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

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

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

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

 

 

 

 

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

 

 

 

 

總結(jié)

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

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

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

[[317842]]

 

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

2018-07-12 09:59:39

microServicmockautoTest

2020-07-09 07:54:35

ThreadPoolE線程池

2016-11-28 16:09:37

2022-12-14 15:16:51

2017-03-17 15:10:52

微信消息撤回功能

2018-03-07 10:50:46

MySQL分布式存儲(chǔ)

2020-04-02 08:47:04

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

2018-05-15 16:57:23

程序員

2020-08-25 07:32:42

工具對(duì)象 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

老司機(jī)

2019-09-19 08:17:02

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

2020-11-09 14:15:23

代碼菜鳥老司機(jī)

2017-05-24 10:58:28

linux系統(tǒng)技巧

2021-08-19 07:34:55

RabbitMQLinuxWindows

2021-06-16 09:55:40

程序員開源編程語言

2018-10-09 09:42:27

MySQL優(yōu)化單表
點(diǎn)贊
收藏

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