成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

老司機阿粉帶你玩轉 Guava 集合類

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

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

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

 

 

 

 

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

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

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

Guava 介紹

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

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

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

 

 

 

 

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

擴展集合類

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

Multiset

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

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

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

 

 

 

 

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

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

 

 

來源于 Github

 

 

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

Multimap

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

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

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

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

 

 

 

 

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

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

 

 

來源于 Github

 

 

BiMap

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

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

 

 

 

 

使用 BiMap 修改上面的代碼:

 

 

 

 

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

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

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

 

 

來源于 Github

 

 

其他擴展集合類

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

  • Table
  • ClassToInstanceMap
  • RangeSet
  • RangeMap

集合工具類

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

 

 

來源于 Github

 

 

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

快速創(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 工具類智能推導 List 泛型,再也不用兩側都重復寫泛型了。

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

 

 

 

 

Lists.transform

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

 

 

 

 

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

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

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

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

 

 

 

 

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

交集并集差集

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

不可變集合

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

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

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

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

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

 

 

 

 

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

 

 

 

 

總結

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

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

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

[[317842]]

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

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分布式存儲

2020-04-02 08:47:04

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

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

2020-11-09 14:15:23

代碼菜鳥老司機

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)化單表
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久福利一牛影视 | 色综合一区 | 欧美成人精品激情在线观看 | 一区二区国产在线观看 | 一级做a爰片性色毛片16 | 免费观看黄网站 | 成人影院免费视频 | 色视频免费 | 国产精品1区2区3区 一区中文字幕 | 精品亚洲一区二区 | 美日韩免费视频 | 放个毛片看看 | 国产美女在线观看 | 精品国产欧美一区二区三区成人 | 久久国产精品99久久久大便 | 国产精品永久 | 欧美一级小视频 | 97精品超碰一区二区三区 | 99久久婷婷国产综合精品电影 | 日韩精品四区 | 久久久亚洲成人 | 久久夜视频| 亚洲综合热 | 国产在线不卡视频 | 永久av| 97人澡人人添人人爽欧美 | 欧美日韩视频在线 | 精品久久久久久亚洲精品 | 色一级 | 人人爽人人爽人人片av | 91麻豆精品国产91久久久更新资源速度超快 | 久久精品免费一区二区 | 亚洲黄色在线免费观看 | 成人高清视频在线观看 | 色综合色综合色综合 | 国产视频中文字幕 | 亚洲精品综合 | 狠狠亚洲| 亚州成人 | av在线免费观看网站 | 日韩影院在线 |