乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      別再這么寫代碼了,這幾個方法不香嗎?

       行者花雕 2021-04-28

      JDK8 應該是 Java 中最堅挺一個版本,這個版本新增很多特性,讓我們開發(fā)起來多了很多便利。

      不過最近 Review 項目代碼的時候發(fā)現(xiàn),雖然很多項目工程已經(jīng)使用了 JDK8,但是工程代碼卻很少使用到 JDK8 新特性、新方法。

      如果單從代碼正確性上來說,老方式寫法寫當然沒有什么問題,那唯一的缺點其實就是代碼行數(shù)比較多,比較繁瑣。

      那同樣的需求,使用 JDK8 新方法,其實幾行代碼就可以搞定,這樣代碼就會變得非常簡潔。

      今天就以三個比較常見的場景為例,教你幾招,使用 JDK8 Map新增的方法簡化代碼開發(fā)。

      下面就來看看這次即將用到 Map幾個新方法:

      歡迎關(guān)注我的公眾號:小黑十一點半,獲得日常干貨推送。如果您對我的專題內(nèi)容感興趣,也可以關(guān)注我的博客:

      預防空指針問題

      日常開發(fā)中我們通常會從 Map獲取元素,然后進行相關(guān)的業(yè)務處理,示例代碼如下:

      Map<String, String> map = new HashMap();
      map.put("公號", "小黑十一點半");
      map.put("主理人", "樓下小黑哥");
      // 可能存在 NPE 問題
      System.out.println(map.get("支付").toUpperCase());
      

      如果就像示例代碼直接處理,一旦 Map中相應元素不存在,那么我們就會碰到空指針問題。

      為了解決這個問題,通常我們可以先判斷一下元素是否為 null,如果不為 null,再做相應的業(yè)務處理。

      // 第一種 if 判空
      String value = map.get("支付");
      if (!Objects.isNull(value)) {
          System.out.println(value.toUpperCase());
      }
      

      這種方式唯一劣勢就是代碼處理上比較繁瑣,不是很簡潔。

      所以針對這種情況,其實可以使用條件運算符,設(shè)置一個默認空值,從而避免后續(xù)處理發(fā)生空指針。

      // 第一種 if 判空
      String value = map.get("支付");
      // 第二種 條件運算符
      value = Objects.isNull(value) ? "" : value;
      

      這種方式比較簡潔,所以日常開發(fā)中我比較喜歡用這種方式。

      ps: 這里的前提,空字符串對于業(yè)務沒有特殊意義。如果存在特殊意義,那就不能使用這種方式了。

      那如果使用 JDK8 ,其實就很方便了,我們就可以使用 Map#getOrDefault直接代替條件運算符。

      // 等同于條件運算符的效果: Objects.isNull(value) ? "" : value;
      String value = map.getOrDefault("支付","");
      

      借助 Map#getOrDefault 一行代碼直接搞定,就是這么簡單。

      如果你還在使用 JDK8 之前的版本,沒辦法使用這個方法。沒關(guān)系,我們可以借助 Apache Common-Lang3 提供的工具類 MapUtils 避免空指針。

      // Apache MapUtils
      String value = MapUtils.getString(map, "支付", "");
      

      MapUtils這個工具類相對于Map#getOrDefault有一個好處,針對傳入 Mapnull 的情況,可以設(shè)置默認值。

      假設(shè)我們是從 POJO對象獲取 Map 參數(shù),這個時候為了防止空指針,我們就需要提前做一個空指針的判斷。

      不過如果使用 MapUtils,那我們就不需要判斷是否為 null,方法內(nèi)部已經(jīng)封裝這個邏輯。

      MapUtils.getString(pojo.getMap(),"支付", "");
      

      巧用 computeIfAbsent

      日常開發(fā)中,我們會碰到這類場景,需要一個鍵需要映射到多個值,這個時候我們可以使用 Map<K, List<V>>這個結(jié)構(gòu)。

      此時添加元素的時候,我們需要做一些判斷,當內(nèi)部元素不存在時候主動創(chuàng)建一個集合對象,示例代碼如下:

      Map<String, List<String>> map = new HashMap();
      
      List<String> classify = map.get("java框架");
      if (Objects.isNull(classify)) {
          classify = new ArrayList<>();
          classify.add("Spring");
          map.put("java框架", classify);
      } else {
          classify.add("Spring");
      }
      

      上面的代碼比較繁瑣,到了 JDK8,Map新增一個 computeIfAbsent方法:

      default V computeIfAbsent(K key,
              Function<? super K, ? extends V> mappingFunction) {
      

      如果 Mapkey 對應的 value 不存在,則會將 mappingFunction 計算產(chǎn)生的值作為保存為該 keyvalue,并且返回該值。否則不作任何計算,將會直接返回 key 對應的 value。

      利用這個特性,我們可以直接使用 Map#computeIfAbsent一行代碼完成上面的場景,示例代碼如下:

      map.computeIfAbsent("java框架", key -> new ArrayList<>()).add("Spring");
      

      那其實 Map 中還有一個方法 putIfAbsent,功能跟 computeIfAbsent比較類似。

      那剛開始使用的時候,誤以為可以使用 putIfAbsent完成上面的需求:

      // ERROR:會有 NPE 問題
      map.putIfAbsent("java框架", new ArrayList<>()).add("Spring");
      

      那其實這是錯誤的,當 Mapkey 對應 value 不存在的時候,putIfAbsent將會直接返回 null。

      computeIfAbsent將會返回 mappingFunction計算之后的值,像上面的場景直接返回就是 new ArrayList。

      這一點需要注意一下,切勿用錯方法,導致空指針。

      最后針對上面這種一個鍵需要映射到多個值,其實還有一個更優(yōu)秀的解決辦法,使用 Google Guava 提供的新集合類型 Multiset,以此快速完成一個鍵需要映射到多個值的場景。

      示例代碼如下:

      ArrayListMultimap<Object, Object> multiset= ArrayListMultimap.create();
      multiset.put("java框架","Spring");
      multiset.put("java框架","Mybatis");
      // java框架--->Spring,Mybatis
      

      單詞統(tǒng)計

      假設(shè)有如下需求,我們需要統(tǒng)計一段文字中相關(guān)單詞出現(xiàn)的次數(shù)。那實現(xiàn)方式其實很簡單,使用 Map存儲相關(guān)單詞的次數(shù)即可,示例代碼如下:

      Map<String, Integer> countMap = new HashMap();
      Integer count = countMap.get("java");
      if (Objects.isNull(count)) {
          countMap.put("java", 1);
      } else {
          countMap.put("java", count++);
      }
      

      這類代碼是不是很熟悉?同樣比較繁瑣。

      接下來我們可以使用 JDK8 Map 新增方法進行改造,這次使用上面用過的 getOrDefault 再加 put 方法快速解決,示例代碼如下:

      // getOrDefault
      Integer count = countMap.getOrDefault("java",0);
      countMap.put("java", count + 1);
      

      那其實我們還有一種辦法,這次我們使用 Map#merge這個新方法,一句代碼完成上述需求,示例代碼如下:

      countMap.merge("java", 1, Integer::sum);
      

      說真的,剛看到 merge這個方法的時候還是有點懵,尤其后面直接使用 lambda 函數(shù),讓人不是很好理解。

      這里先將lambda 函數(shù)還原成正常類,給大家著重解釋一下這個方法:

      countMap.merge("java", 1, new BiFunction<Integer, Integer, Integer>() {
          @Override
          public Integer apply(Integer oldValue, Integer newValue) {
              return Integer.sum(oldValue,newValue);
          }
      });
      

      用上面代碼說明一下merge方法,如果 java這個值在 countMap中不存在,那么將會其對應的 value 設(shè)置為 1。

      那如果 javacountMap 中存在,則會調(diào)用第三個參數(shù) remappingFunction 函數(shù)方法進行計算。

      remappingFunction 函數(shù)中,oldValue代表原先 countMapjava 的值,newValue代表我們設(shè)置第二個參數(shù) 1,這里我們將兩者相加,剛好完成累加的需求。

      最后

      這次主要從個人日常碰到三個場景出發(fā),給大家對比了一下使用 JDK8 Map 新增方法只會,兩者代碼區(qū)別。

      從上面可以很明顯看出,使用新增方法之后,我們可以用很少的代碼可以完成,整體看起來變得非常簡潔。

      不過 JDK8 之后很多方法都會用到 lambda 函數(shù),不熟悉的話,其實比較難以理解代碼。

      不過也還好,我們只要在日常編碼過程中,刻意去練習使用,很快就能上手。

      最后,JDK8 還有許多好用方法,刻意簡化代碼開發(fā),你可以在留言區(qū)推薦幾個嗎?

      歡迎關(guān)注我的公眾號:小黑十一點半,獲得日常干貨推送。如果您對我的專題內(nèi)容感興趣,也可以關(guān)注我的博客:

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多