<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          我司為什么禁止使用阿里巴巴 Java 規(guī)范?

          共 13598字,需瀏覽 28分鐘

           ·

          2023-07-14 18:31

          點擊下方“ IT牧場 ”,選擇“設(shè)為星標”

          d007ec32c7d17faf97ffb8fdff857de6.webp

              

          來源:www.jianshu.com/p/97778b21bd00

                
                    


                      


          前言

          阿里巴巴出了一本Java規(guī)范,在國內(nèi)Java開發(fā)眼里被賦予了神圣的殿堂,但是我司禁止使用阿里巴巴的開發(fā)手冊。

          目前Google Guava在實際應(yīng)用中非常廣泛,本篇博客將以博主對Guava使用的認識以及在項目中的經(jīng)驗來給大家分享!學(xué)習(xí)使用Google Guava可以讓你快樂編程,寫出優(yōu)雅的JAVA代碼!

          面向?qū)ο笏枷胩幚碜址?/span>

          Joiner/Splitter/CharMatcher JDK提供的String還不夠好么? 也許還不夠友好,至少讓我們用起來還不夠爽,還得操心!

          舉個栗子,比如String提供的split方法,我們得關(guān)心空字符串吧,還得考慮返回的結(jié)果中存在null元素吧,只提供了前后trim的方法(如果我想對中間元素進行trim呢)。

          1)Joiner/Splitter 那么,看下面的代碼示例,guava讓你不必在操心這些:
          e56381349c6e4db18c76a9cc1b90aa70.webp

          Joiner是連接器,Splitter是分割器,通常我們會把它們定義為static final,利用on生成對象后在應(yīng)用到String進行處理,這是可以復(fù)用的。要知道apache commons StringUtils提供的都是static method。

          更加重要的是,guava提供的Joiner/Splitter是經(jīng)過充分測試,它的穩(wěn)定性和效率要比apache高出不少,這個你可以自行測試下~

          發(fā)現(xiàn)沒有我們想對String做什么操作,就是生成自己定制化的Joiner/Splitter,多么直白,簡單,流暢的API!

          對于Joiner,常用的方法是跳過NULL元素: skipNulls()?/?對于NULL元素使用其他替代:useForNull(String) 對于Splitter,常用的方法是: trimResults()/omitEmptyStrings()。注意拆分的方式,有字符串,還有正則,還有固定長度分割(太貼心了!) 2)CharMatcher 其實除了Joiner/Splitter外,guava還提供了字符串匹配器:CharMatcher
          CharMatcher,將字符的匹配和處理解耦,并提供豐富的方法供你使用!

          對基本類型進行支持

          guava對JDK提供的原生類型操作進行了擴展,使得功能更加強大! 50e56dc4866f284f880ce5c94f8a6b04.webpgoogle guava中提供了 Bytes/Shorts/Ints/Iongs/Floats/Doubles/Chars/Booleans這些基本數(shù)據(jù)類型的擴展支持,只有你想不到的,沒有它沒有的!

          JDK集合的有效補充

          灰色地帶:Multiset

          JDK的集合,提供了有序且可以重復(fù)的List,無序且不可以重復(fù)的Set。那這里其實對于集合涉及到了2個概念,一個order,一個dups。那么List vs Set,and then some ?

          b0ba41f83ca450cb24c5158ed231a5c5.webp

          Multiset是什么,我想上面的圖,你應(yīng)該了解它的概念了。Multiset就是無序的,但是可以重復(fù)的集合,它就是游離在List/Set之間的“灰色地帶”?。ㄖ劣谟行虻?,不允許重復(fù)的集合嘛,guava還沒有提供,當然在未來應(yīng)該會提供UniqueList,我猜的,哈哈)

          來看一個Multiset的示例:

          657e976a53ae596146f8a49214b7ca3c.webp

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

          Immutable vs unmodifiable

          來我們先看一個unmodifiable的例子: 你看到JDK提供的unmodifiable的缺陷了嗎?更多關(guān)于java基礎(chǔ)面試資料,公眾號互聯(lián)網(wǎng)架構(gòu)師,回復(fù)“面試”,獲取面試資料,支持在線刷題。

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

          也即是說我們改變源集合,導(dǎo)致不可變視圖(unmodifiable View)也會發(fā)生變化,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階段還考慮了線程的并發(fā)性等,很智能的?。?,O(∩_∩)O哈哈~

          guava提供了很多Immutable集合,比如

          ImmutableList/ImmutableSet/ImmutableSortedSet/ImmutableMap/…

          看一個ImmutableMap的例子:
          57e2385d173de10d8d843884f8f3042b.webp

          可不可以一對多:Multimap

          JDK提供給我們的Map是一個鍵,一個值,一對一的,那么在實際開發(fā)中,顯然存在一個KEY多個VALUE的情況(比如一個分類下的書本),我們往往這樣表達:Map<k,List<v>>,好像有點臃腫!臃腫也就算了,更加不爽的事,我們還得判斷KEY是否存在來決定是否new 一個LIST出來,有點麻煩!更加麻煩的事情還在后頭,比如遍歷,比如刪除,so hard......

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

          805434dd44dbc5cc32a20573d1cbdb28.webp

          友情提示下,guava所有的集合都有create方法 ,這樣的好處在于簡單,而且我們不必在重復(fù)泛型信息了。

          get()/keys()/keySet()/values()/entries()/asMap()都是非常有用的返回view collection的方法。

          Multimap的實現(xiàn)類有:
          ArrayListMultimap/HashMultimap/LinkedHashMultimap/TreeMultimap/ImmutableMultimap/…

          可不可以雙向:BiMap

          JDK提供的MAP讓我們可以find value by key,那么能不能通過find key by value呢,能不能KEY和VALUE都是唯一的呢。這是一個雙向的概念,即forward+backward。

          在實際場景中有這樣的需求嗎?比如通過用戶ID找到mail,也需要通過mail找回用戶名。沒有g(shù)uava的時候,我們需要create forward map AND create backward map,and now just let guava do that for you.


          biMap/biMap.inverse()/biMap.inverse().inverse()它們是什么關(guān)系呢? 你可以稍微看一下BiMap的源碼實現(xiàn),實際上,當你創(chuàng)建BiMap的時候,在內(nèi)部維護了2個map,一個forward map,一個backward map,并且設(shè)置了它們之間的關(guān)系。因此,biMap.inverse()? != biMap ;biMap.inverse().inverse() == biMap

          可不可以多個KEY:Table

          我們知道數(shù)據(jù)庫除了主鍵外,還提供了復(fù)合索引,而且實際中這樣的多級關(guān)系查找也是比較多的,當然我們可以利用嵌套的Map來實現(xiàn):Map<k1,Map<k2,v2>>。為了讓我們的代碼看起來不那么丑陋,guava為我們提供了Table。 d0534ccf798f8810bd733d8b68171b77.webp
          Table涉及到3個概念: rowKey,columnKey,value ,并提供了多種視圖以及操作方法讓你更加輕松的處理多個KEY的場景。

          函數(shù)式編程:Functions

          cd10564656d0132eb0c27c474436a0d0.webp

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

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

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

          ff5098fd5c1510d77d1bc50a6dd377bf.webp

          斷言:Predicate

          c88b56fd0b007cbe48e8f2d90d7a8d75.webpPredicate最常用的功能就是運用在集合的過濾當中! d205b020a16ed320edc9e90f512c5267.webp

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

          check null and other

          在guava中,對于null的處理手段是快速失敗,你可以看看guava的源碼,很多方法的第一行就是Preconditions.checkNotNull(elements); 要知道null是模糊的概念,是成功呢,還是失敗呢,還是別的什么含義呢?

          Cache is king

          對于大多數(shù)互聯(lián)網(wǎng)項目而言,緩存的重要性,不言而喻! 如果我們的應(yīng)用系統(tǒng),并不想使用一些第三方緩存組件(如redis),我們僅僅想在本地有一個功能足夠強大的緩存,很可惜JDK提供的那些SET/MAP還不行! 566f252c612394f42df099e564d9b9e5.webp

          首先,這是一個本地緩存,guava提供的cache是一個簡潔、高效,易于維護的。為什么這么說呢?

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

          其次,我們看到了,我們非常通俗的告訴cache,我們的緩存策略是什么,SO EASY!在如此簡單的背后,是guava幫助我們做了很多事情,比如線程安全。

          讓異步回調(diào)更加簡單

          JDK中提供了Future/FutureTask/Callable來對異步回調(diào)進行支持,但是還是看上去挺復(fù)雜的,能不能更加簡單呢?比如注冊一個監(jiān)聽回調(diào)。 9c037c46a1a53c9c29df5c7d84e5f8b6.webp 我們可以通過guava對JDK提供的線程池進行裝飾,讓其具有異步回調(diào)監(jiān)聽功能,然后在設(shè)置監(jiān)聽器即可!

          Summary

          到這里,這篇文章也只介紹了guava的冰山一角,其實還有很多內(nèi)容: f90240a3d892aef843371a9cf43acc2f.webp

          比如反射、注解、網(wǎng)絡(luò)、并發(fā)、IO等等。

                                      

          干貨分享

          最近將個人學(xué)習(xí)筆記整理成冊,使用PDF分享。關(guān)注我,回復(fù)如下代碼,即可獲得百度盤地址,無套路領(lǐng)??!

          ?001:《Java并發(fā)與高并發(fā)解決方案》學(xué)習(xí)筆記; ?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學(xué)習(xí)筆記; ?003:《Java面試寶典》 ?004:《Docker開源書》 ?005:《Kubernetes開源書》 ?006:《DDD速成(領(lǐng)域驅(qū)動設(shè)計速成)》 ?007:全部 ?008:加技術(shù)群討論

          加個關(guān)注不迷路

          喜歡就點個"在看"唄^_^

          瀏覽 94
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91在线无码精品秘 入口男同 | 影音先锋av黄色 影音先锋成人网址 | 欧美黄色高清视频免费 | 国产精品人妻无码一区牛牛影视 | 亚洲丁香|