精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Google Guava,優秀的腳手架

開發 開發工具
1995 年的時候,我的“公明”哥哥——Java 出生了。經過 20 年的發展,他已經成為世界上最流行的編程語言了,請允許我有失公允的把“之一”給去了。

 [[374241]]

本文轉載自微信公眾號「沉默王二」,可以通過以下二維碼關注。轉載本文請聯系沉默王二公眾號。

01、前世今生

你好呀,我是 Guava。

1995 年的時候,我的“公明”哥哥——Java 出生了。經過 20 年的發展,他已經成為世界上最流行的編程語言了,請允許我有失公允的把“之一”給去了。

雖然他時常遭受著各種各樣的吐槽,但他始終沒有停下前進的腳步。除了他本身的不斷進化,圍繞著他的大大小小的兄弟們也在不斷地更新迭代。我正是在這樣的背景下應運而生的,我簡單易用,對我大哥是一個非常好的補充,可以說,只要你有使用我哥作為開發語言的項目,幾乎都能看到我的身影。

我由 Google 公司開源,目前在 GitHub 上已經有 39.9k 的鐵粉了,由此可以證明我的受歡迎程度。

我的身體里主要包含有這些常用的模塊:集合 [collections] 、緩存 [caching] 、原生類型支持 [primitives support] 、并發庫 [concurrency libraries] 、通用注解 [common annotations] 、字符串處理 [string processing] 、I/O 等。新版的 JDK 中已經直接把我引入了,可想而知我有多優秀,忍不住驕傲了。

這么說吧,學好如何使用我,能讓你在編程中變得更快樂,寫出更優雅的代碼!

02、引入 Guava

如果你要在 Maven 項目使用我的話,需要先在 pom.xml 文件中引入我的依賴。

  1. <dependency> 
  2.     <groupId>com.google.guava</groupId> 
  3.     <artifactId>guava</artifactId> 
  4.     <version>30.1-jre</version> 
  5. </dependency> 

一點要求,JDK 版本需要在 8 以上。

03、基本工具

Doug Lea,java.util.concurrent 包的作者,曾說過一句話:“null 真糟糕”。Tony Hoare,圖靈獎得主、快速排序算法的作者,當然也是 null 的創建者,也曾說過類似的話:“null 的使用,讓我損失了十億美元。”鑒于此,我用 Optional 來表示可能為 null 的對象。

代碼示例如下所示。

  1. Optional<Integer> possible = Optional.of(5); 
  2. possible.isPresent(); // returns true 
  3. possible.get(); // returns 5 

我大哥在 JDK 8 中新增了 Optional 類,顯然是從我這借鑒過去的,不過他的和我的有些不同。

  • 我的 Optional 是 abstract 的,意味著我可以有子類對象;我大哥的是 final 的,意味著沒有子類對象。
  • 我的 Optional 實現了 Serializable 接口,可以序列化;我大哥的沒有。
  • 我的一些方法和我大哥的也不盡相同。

使用 Optional 除了賦予 null 語義,增加了可讀性,最大的優點在于它是一種傻瓜式的防護。Optional 迫使你積極思考引用缺失的情況,因為你必須顯式地從 Optional 獲取引用。

除了 Optional 之外,我還提供了:

  • 參數校驗
  • 常見的 Object 方法,比如說 Objects.equals、Objects.hashCode,JDK 7 引入的 Objects 類提供同樣的方法,當然也是從我這借鑒的靈感。
  • 更強大的比較器

04、集合

首先我來說一下,為什么需要不可變集合。

  • 保證線程安全。在并發程序中,使用不可變集合既保證線程的安全性,也大大地增強了并發時的效率(跟并發鎖方式相比)。
  • 如果一個對象不需要支持修改操作,不可變的集合將會節省空間和時間的開銷。
  • 可以當作一個常量來對待,并且集合中的對象在以后也不會被改變。

與 JDK 中提供的不可變集合相比,我提供的 Immutable 才是真正的不可變,我為什么這么說呢?來看下面這個示例。

下面的代碼利用 JDK 的 Collections.unmodifiableList(list) 得到一個不可修改的集合 unmodifiableList。

  1. List list = new ArrayList(); 
  2. list.add("雷軍"); 
  3. list.add("喬布斯"); 
  4.  
  5. List unmodifiableList = Collections.unmodifiableList(list); 
  6. unmodifiableList.add("馬云"); 

運行代碼將會出現以下異常:

  1. Exception in thread "main" java.lang.UnsupportedOperationException 
  2.  at java.base/java.util.Collections$UnmodifiableCollection.add(Collections.java:1060) 
  3.  at com.itwanger.guava.NullTest.main(NullTest.java:29) 

很好,執行 unmodifiableList.add() 的時候拋出了 UnsupportedOperationException 異常,說明 Collections.unmodifiableList() 返回了一個不可變集合。但真的是這樣嗎?

你可以把 unmodifiableList.add() 換成 list.add()。

  1. List list = new ArrayList(); 
  2. list.add("雷軍"); 
  3. list.add("喬布斯"); 
  4.  
  5. List unmodifiableList = Collections.unmodifiableList(list); 
  6. list.add("馬云"); 

再次執行的話,程序并沒有報錯,并且你會發現 unmodifiableList 中真的多了一個元素。說明什么呢?

Collections.unmodifiableList(…) 實現的不是真正的不可變集合,當原始集合被修改后,不可變集合里面的元素也是跟著發生變化。

我就不會犯這種錯,來看下面的代碼。

  1. List<String> stringArrayList = Lists.newArrayList("雷軍","喬布斯"); 
  2. ImmutableList<String> immutableList = ImmutableList.copyOf(stringArrayList); 
  3. immutableList.add("馬云"); 

嘗試 immutableList.add() 的時候會拋出 UnsupportedOperationException。我在源碼中已經把 add() 方法廢棄了。

  1. /** 
  2.  * Guaranteed to throw an exception and leave the collection unmodified. 
  3.  * 
  4.  * @throws UnsupportedOperationException always 
  5.  * @deprecated Unsupported operation. 
  6.  */ 
  7. @CanIgnoreReturnValue 
  8. @Deprecated 
  9. @Override 
  10. public final boolean add(E e) { 
  11.   throw new UnsupportedOperationException(); 

嘗試 stringArrayList.add() 修改原集合的時候 immutableList 并不會因此而發生改變。

除了不可變集合以外,我還提供了新的集合類型,比如說:

  • Multiset,可以多次添加相等的元素。當把 Multiset 看成普通的 Collection 時,它表現得就像無序的 ArrayList;當把 Multiset 看作 Map
  • Multimap,可以很容易地把一個鍵映射到多個值。
  • BiMap,一種特殊的 Map,可以用 inverse() 反轉BiMap

05、字符串處理

字符串表示字符的不可變序列,創建后就不能更改。在我們日常的工作中,字符串的使用非常頻繁,熟練的對其操作可以極大的提升我們的工作效率。

我提供了連接器——Joiner,可以用分隔符把字符串序列連接起來。下面的代碼將會返回“雷軍; 喬布斯”,你可以使用 useForNull(String) 方法用某個字符串來替換 null,而不像 skipNulls() 方法那樣直接忽略 null。

  1. Joiner joiner = Joiner.on("; ").skipNulls(); 
  2. return joiner.join("雷軍"null"喬布斯"); 

我還提供了拆分器—— Splitter,可以按照指定的分隔符把字符串序列進行拆分。

  1. Splitter.on(','
  2.         .trimResults() 
  3.         .omitEmptyStrings() 
  4.         .split("雷軍,喬布斯,,   沉默王二"); 

06、緩存

緩存在很多場景下都是相當有用的。你應該知道,檢索一個值的代價很高,尤其是需要不止一次獲取值的時候,就應當考慮使用緩存。

我提供的 Cache 和 ConcurrentMap 很相似,但也不完全一樣。最基本的區別是 ConcurrentMap 會一直保存所有添加的元素,直到顯式地移除。相對地,我提供的 Cache 為了限制內存占用,通常都設定為自動回收元素。

如果你愿意消耗一些內存空間來提升速度,你能預料到某些鍵會被查詢一次以上,緩存中存放的數據總量不會超出內存容量,就可以使用 Cache。

來個示例你感受下吧。

  1. @Test 
  2. public void testCache() throws ExecutionException, InterruptedException { 
  3.  
  4.     CacheLoader cacheLoader = new CacheLoader<String, Animal>() { 
  5.         // 如果找不到元素,會調用這里 
  6.         @Override 
  7.         public Animal load(String s) { 
  8.             return null
  9.         } 
  10.     }; 
  11.     LoadingCache<String, Animal> loadingCache = CacheBuilder.newBuilder() 
  12.         .maximumSize(1000) // 容量 
  13.         .expireAfterWrite(3, TimeUnit.SECONDS) // 過期時間 
  14.         .removalListener(new MyRemovalListener()) // 失效監聽器 
  15.         .build(cacheLoader); // 
  16.     loadingCache.put("狗", new Animal("旺財", 1)); 
  17.     loadingCache.put("貓", new Animal("湯姆", 3)); 
  18.     loadingCache.put("狼", new Animal("灰太狼", 4)); 
  19.  
  20.     loadingCache.invalidate("貓"); // 手動失效 
  21.  
  22.     Animal animal = loadingCache.get("狼"); 
  23.     System.out.println(animal); 
  24.     Thread.sleep(4 * 1000); 
  25.     // 狼已經自動過去,獲取為 null 值報錯 
  26.     System.out.println(loadingCache.get("狼")); 
  27.  
  28. /** 
  29.  * 緩存移除監聽器 
  30.  */ 
  31. class MyRemovalListener implements RemovalListener<String, Animal> { 
  32.  
  33.     @Override 
  34.     public void onRemoval(RemovalNotification<String, Animal> notification) { 
  35.         String reason = String.format("key=%s,value=%s,reason=%s", notification.getKey(), notification.getValue(), notification.getCause()); 
  36.         System.out.println(reason); 
  37.     } 
  38.  
  39. class Animal { 
  40.     private String name
  41.     private Integer age; 
  42.  
  43.     public Animal(String nameInteger age) { 
  44.         this.name = name
  45.         this.age = age; 
  46.     } 

CacheLoader 中重寫了 load 方法,這個方法會在查詢緩存沒有命中時被調用,我這里直接返回了 null,其實這樣會在沒有命中時拋出 CacheLoader returned null for key 異常信息。

MyRemovalListener 作為緩存元素失效時的監聽類,在有元素緩存失效時會自動調用 onRemoval 方法,這里需要注意的是這個方法是同步方法,如果這里耗時較長,會阻塞直到處理完成。

LoadingCache 就是緩存的主要操作對象了,常用的就是其中的 put 和 get 方法了。

07、尾聲

上面介紹了我認為最常用的功能,作為 Google 公司開源的 Java 開發核心庫,個人覺得實用性還是很高的(不然呢?嘿嘿嘿)。引入到你的項目后不僅能快速的實現一些開發中常用的功能,而且還可以讓代碼更加的優雅簡潔。

我覺得適用于每一個 Java 項目,至于其他的一些功能,比如說散列、事件總線、數學運算、反射,就等待你去發掘了。

 

責任編輯:武曉燕 來源: 沉默王二
相關推薦

2021-12-23 10:35:32

SpringCloud腳手架架構

2025-05-16 07:24:41

Springkafka腳手架

2016-09-07 15:35:06

VueReact腳手架

2020-03-20 08:32:41

物聯網腳手架傳感器

2021-05-21 05:22:52

腳手架工具項目

2018-08-30 16:08:37

Node.js腳手架工具

2022-04-24 11:33:47

代碼管理工程

2018-06-11 14:39:57

前端腳手架工具node.js

2023-11-21 17:36:04

OpenFeignSentinel

2019-12-25 15:20:48

前端腳手架命令

2014-08-15 09:36:06

2024-03-11 13:18:00

RustClap項目

2020-06-29 11:35:02

Spring BootJava腳手架

2022-01-14 14:09:11

腳手架代碼自定義

2017-07-21 09:56:46

Webpack3 Vue.js腳手架

2022-07-18 07:58:46

Spring工具工具類

2020-08-19 08:55:47

Redis緩存數據庫

2022-12-12 08:56:45

Vite3Vite

2021-11-08 09:35:09

Vue代碼前端

2009-09-16 15:05:58

CakePHP腳手架
點贊
收藏

51CTO技術棧公眾號

精品无码人妻一区二区三区| xx欧美撒尿嘘撒尿xx| 亚洲精品无amm毛片| 在线精品亚洲| 亚洲少妇中文在线| 黄色一级片免费播放| 97人人在线视频| 久久久精品国产99久久精品芒果| 成人信息集中地欧美| 日韩成人免费在线视频| 日韩欧美一区二区三区免费看| 日韩欧美一区二区三区在线| 91看片就是不一样| 亚洲国产精品精华素| 国产亚洲短视频| 成人av片网址| 97精品人妻一区二区三区香蕉 | 麻豆精品在线视频| 午夜精品免费视频| av激情在线观看| 国产一区二区三区不卡视频网站| 精品久久一二三区| 五月天视频在线观看| 东京一区二区| 午夜精品一区在线观看| 中国成人在线视频| 青青免费在线视频| 国产激情一区二区三区四区 | 亚洲黄色网址大全| 一区二区在线免费播放| 色8久久精品久久久久久蜜| 亚洲国产日韩综合一区| 丰满肉嫩西川结衣av| 美女网站色91| 欧美在线视频免费播放| 青娱乐在线视频免费观看| 国产亚洲第一伦理第一区| 日韩一区二区视频| 美女喷白浆视频| av电影在线免费| 亚洲天天做日日做天天谢日日欢| 久久精品美女| 国产成人精品无码高潮| 蜜臀av国产精品久久久久 | 中文字幕无码日韩专区免费| 亚洲伊人春色| 亚洲成人网在线| 中文字幕第22页| 69堂免费精品视频在线播放| 疯狂欧美牲乱大交777| 女同性恋一区二区| 成av人电影在线观看| 99久久婷婷国产| 国产精品.com| 国产高潮流白浆喷水视频| 日本女人一区二区三区| 日韩av成人在线| 天天综合网入口| 亚洲国产精品成人| 久久精品国产亚洲一区二区| 精品人体无码一区二区三区| 久久成人高清| 亚洲性av网站| 久久久亚洲av波多野结衣| 美国十次av导航亚洲入口| 精品1区2区在线观看| 美女露出粉嫩尿囗让男人桶| 88xx成人网| 欧亚洲嫩模精品一区三区| aaaaaa亚洲| 日本韩国欧美| 欧洲在线/亚洲| 国产精品视频黄色| 久久久久久一区二区三区四区别墅| 欧美主播一区二区三区美女| 手机看片福利日韩| 免费视频成人| 在线成人免费观看| 性色av浪潮av| 国产精品久久久网站| 亚洲国产欧美一区二区丝袜黑人| 欧美熟妇精品一区二区蜜桃视频| 国产精品一线| 精品av久久707| 97超碰在线资源| 不卡在线一区二区| 日韩亚洲精品视频| 99久久久免费精品| 欧美天天视频| 日本91av在线播放| 真实的国产乱xxxx在线91| 美国十次了思思久久精品导航| 亚洲一区中文字幕| 空姐吹箫视频大全| 国产午夜亚洲精品午夜鲁丝片| 日韩激情久久| 91在线中文| 欧美日韩国产在线播放| 香蕉视频网站入口| 国产成人免费av一区二区午夜 | 一本久道综合久久精品| 欧美一区三区三区高中清蜜桃| 中文无码av一区二区三区| 国产毛片一区| 国产欧美久久久久久| 亚洲第一成年人网站| 26uuu欧美| 99精品视频网站| 白浆在线视频| 欧美情侣在线播放| 中文字幕精品视频在线| 久久一区二区三区喷水| 欧美极品第一页| 午夜一级黄色片| 国产成人综合视频| 欧美日韩免费高清| av片在线观看| 欧美在线播放高清精品| 无码人妻一区二区三区一| 国产亚洲欧美日韩在线观看一区二区| 久久伊人91精品综合网站| 国产超碰人人爽人人做人人爱| 美女免费视频一区| 加勒比在线一区二区三区观看| av电影在线网| 日韩欧美一区二区三区久久| 天天干天天草天天| av不卡一区| 一区二区日韩精品| 久久精品一级片| 麻豆精品久久久| 久久综合久久综合这里只有精品| caoporn免费在线| 色噜噜久久综合| 亚洲视频 中文字幕| 婷婷久久综合| 国产精品嫩草影院久久久| 好吊色视频一区二区| 亚洲人成亚洲人成在线观看图片| 成人精品小视频| 久久精品国产亚洲5555| 久久天天躁夜夜躁狠狠躁2022| 黄色污污网站在线观看| 成人18视频在线播放| 久久免费一级片| 欧美视频在线视频精品| 国产一区二区日韩精品欧美精品| 日本少妇毛茸茸高潮| 国产一区二区调教| 日本在线播放不卡| 国语对白在线刺激| 亚洲第一精品夜夜躁人人躁| www青青草原| 国产一区在线精品| 热这里只有精品| 未满十八勿进黄网站一区不卡| 亚洲精品一区二区网址| 日韩美女一级片| 丁香五精品蜜臀久久久久99网站 | 日韩精品欧美激情一区二区| 日韩暖暖在线视频| 免费一级毛片在线观看| 日韩欧美在线视频免费观看| 色婷婷精品久久二区二区密| 亚洲黄色在线| 精品久久精品久久| 日韩伦理在线一区| 亚洲男人天堂网站| 日韩精品乱码久久久久久| 国产成人免费高清| 午夜探花在线观看| 久久伦理中文字幕| 欧美精品在线极品| 黄色aaa毛片| 婷婷激情综合网| 欧美成人午夜精品免费| 日韩电影在线观看电影| 五月天色一区| 日韩av黄色| 久久精品视频99| 午夜精品久久久久久久爽| 亚洲一区二区三区不卡国产欧美| 人妻av一区二区| 久久九九电影| 亚洲欧美日韩精品综合在线观看 | 欧美性色黄大片| 国产中文字幕久久| 国产精品99久| 国产最新免费视频| 成人高清av| 99re在线观看| 中文字幕资源网在线观看免费| 亚洲一区二区久久| 国产v在线观看| 亚洲一区二区三区视频在线播放| 老司机午夜免费福利| 全国精品久久少妇| 亚洲天堂第一区| 亚洲香蕉视频| 成人免费视频网址| av电影在线地址| 夜夜嗨av色一区二区不卡| 国产精品伦一区二区三区| 亚洲一区二区三区爽爽爽爽爽| 日本黄色网址大全| 精品午夜一区二区三区在线观看| www插插插无码视频网站| 欧洲毛片在线视频免费观看| 91|九色|视频| 625成人欧美午夜电影| 久久精品91久久香蕉加勒比| 少妇人妻精品一区二区三区| 欧美三级在线视频| 日本五十路女优| 国产精品网友自拍| 欧亚乱熟女一区二区在线 | 岛国av在线免费| 在线观看视频免费一区二区三区| 性刺激综合网| 三级小说欧洲区亚洲区| 91欧美激情另类亚洲| 97久久香蕉国产线看观看| 久久精品亚洲94久久精品| 日本大片在线观看| 精品久久一区二区| 亚洲专区第一页| 欧美性黄网官网| 欧美激情国产精品免费| 亚洲国产高清在线观看视频| 欧美做受喷浆在线观看| 国产精品69久久久久水密桃| av在线无限看| 久久亚洲精选| 黄色一级视频片| 亚洲国产一成人久久精品| 免费成人在线观看av| 久久动漫网址| 国产精品久久久久久久久久直播| 日韩一区二区三免费高清在线观看| 欧美专区第一页| 成全电影大全在线观看| 久久久国产精品一区| www日韩tube| 亚洲跨种族黑人xxx| 丰满熟妇乱又伦| 日韩三级在线免费观看| 91精东传媒理伦片在线观看| 91国内精品野花午夜精品| 欧美bbbbbbbbbbbb精品| 国产精品久久久久久妇女6080| 变态另类ts人妖一区二区| 久久久久国产精品人| 超碰97在线资源站| av一二三不卡影片| 日本一卡二卡在线| 国产一区二区三区免费播放| 日本激情综合网| 美女视频黄频大全不卡视频在线播放| 欧美性猛交久久久乱大交小说| 亚洲永久免费| 免费av网址在线| 日韩国产在线观看一区| 久久精品香蕉视频| 视频在线观看一区| 欧美久久一二区| 日本视频www| 亚洲一区二区在线免费观看视频| 午夜精品一区二区三区视频| 亚洲日穴在线视频| 亚洲一级黄色录像| 国产欧美日韩久久| 色婷婷粉嫩av| 一级特黄大欧美久久久| 免费在线观看亚洲| 亚洲va中文字幕| 精品免费囯产一区二区三区| 色综合色狠狠天天综合色| 国产精品乱码一区二区视频| 欧美日韩一级二级三级| 一区二区三区黄| 欧美一区二区视频在线观看2020| www.桃色av嫩草.com| 日韩国产激情在线| 超碰在线国产| 欧美精品在线播放| 乱馆动漫1~6集在线观看| 青青精品视频播放| 国产成人77亚洲精品www| 91沈先生在线观看| 欧洲vs亚洲vs国产| 亚洲乱码一区二区三区| 欧美va天堂| 人人干视频在线| 免费人成黄页网站在线一区二区| 伊人色在线观看| 成人av在线网| 欧美自拍偷拍网| 亚洲一级二级三级在线免费观看| 毛片在线免费视频| 欧美色网站导航| 午夜精品小视频| 一区二区欧美日韩视频| 欧美亚洲天堂| 国产精品白丝jk喷水视频一区| 日韩成人视屏| 日本一区免费在线观看| 亚洲欧美文学| 免费av观看网址| 老司机免费视频一区二区| 性欧美18—19sex性高清| 国产精品网曝门| 日韩欧美三级视频| 欧美久久久久中文字幕| 日本a一级在线免费播放| 久久精品亚洲94久久精品| 欧美办公室脚交xxxx| 亚洲一区二区三区sesese| 自拍视频一区| 17c丨国产丨精品视频| 日本美女一区二区| 在线播放av网址| 亚洲欧美一区二区三区国产精品| 国产91精品一区| 精品少妇一区二区三区免费观看| 成人在线观看网站| 97视频在线观看视频免费视频 | 综合自拍亚洲综合图不卡区| 六月丁香激情综合| 欧美电视剧在线看免费| 欧美成人高清在线| 国产精品久久久一区| 琪琪久久久久日韩精品| 五月天激情图片| 狠狠色丁香久久婷婷综合_中| 香蕉网在线播放| 亚洲18女电影在线观看| 国产99久久九九精品无码免费| 亚洲性视频网址| 美女搞黄视频在线观看| 91视频九色网站| 日韩在线观看| 国产精品一区二区羞羞答答| 91免费看视频| 久久精品久久精品久久| 日韩亚洲欧美在线| 麻豆影视国产在线观看| 国产欧美在线视频| 精品久久久久久久久久久下田| 久久久999免费视频| 成人精品免费视频| 免费一级黄色大片| 日韩片之四级片| 国产精品—色呦呦| 99久久精品久久久久久ai换脸| 在线免费观看日本欧美爱情大片| 午夜激情av在线| 国产精品久久久久国产精品日日| 日本成人一级片| 中文字幕视频在线免费欧美日韩综合在线看 | 中文字幕av一区二区三区人| 波多野结衣之无限发射| av中文字幕一区| 懂色av.com| 亚洲а∨天堂久久精品喷水| 国内在线免费视频| 国产精华一区二区三区| 亚洲久色影视| 中文字幕av网址| 欧美亚洲一区二区在线| 91网在线播放| 91免费看国产| 亚洲午夜久久久久久尤物| 91传媒理伦片在线观看| 亚洲va天堂va国产va久| 青青青草原在线| 国产精品欧美日韩久久| 欧美视频免费| 亚洲美女爱爱视频| 中文字幕亚洲成人| www视频在线| 午夜精品久久久久久久99黑人| 久久综合社区| 久久午夜夜伦鲁鲁一区二区| 国产精品久久久久影院老司| 国产女人18毛片水真多| 欧美精品videosex性欧美| 亚洲综合图色| 一级片视频免费观看| 亚洲精品欧美二区三区中文字幕| 中文字幕在线观看你懂的| 日韩视频免费观看| 日韩精品一区二区三区中文 | 激情婷婷久久| 国产性生活毛片| 精品久久香蕉国产线看观看gif| 国产二区在线播放| 1卡2卡3卡精品视频| 一区二区黄色| 潘金莲一级黄色片| 精品91自产拍在线观看一区|