<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>

          Map在Java 8中增加非常實用哪些函數(shù)接口?

          2021-02-03 00:08

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 5.5 分鐘。

          來自:網(wǎng)絡(luò)


          Map中的新方法

          相比?Collection,Map中加入了更多的方法!

          forEach()

          該方法簽名為void forEach(BiConsumer action),作用是對Map中的每個映射執(zhí)行action指定的操作,其中BiConsumer是一個函數(shù)接口,里面有一個待實現(xiàn)方法void accept(T t, U u)。BinConsumer接口名字和accept()方法名字都不重要,請不要記憶他們。
          需求:假設(shè)有一個數(shù)字到對應(yīng)英文單詞的Map,請輸出Map中的所有映射關(guān)系.
          Java7以及之前經(jīng)典的代碼如下:

          //?Java7以及之前迭代Map
          HashMap?map?=?new?HashMap<>();
          map.put(1,?"one");
          map.put(2,?"two");
          map.put(3,?"three");
          for(Map.Entry?entry?:?map.entrySet()){
          ????System.out.println(entry.getKey()?+?"="?+?entry.getValue());
          }

          使用Map.forEach()方法,結(jié)合匿名內(nèi)部類,代碼如下:

          //?使用forEach()結(jié)合匿名內(nèi)部類迭代Map
          HashMap?map?=?new?HashMap<>();
          map.put(1,?"one");
          map.put(2,?"two");
          map.put(3,?"three");
          map.forEach(new?BiConsumer(){
          ????@Override
          ????public?void?accept(Integer?k,?String?v){
          ????????System.out.println(k?+?"="?+?v);
          ????}
          });

          上述代碼調(diào)用forEach()方法,并使用匿名內(nèi)部類實現(xiàn)BiConsumer接口。當(dāng)然,實際場景中沒人使用匿名內(nèi)部類寫法,因為有Lambda表達(dá)式:

          //?使用forEach()結(jié)合Lambda表達(dá)式迭代Map
          HashMap?map?=?new?HashMap<>();
          map.put(1,?"one");
          map.put(2,?"two");
          map.put(3,?"three");
          map.forEach((k,?v)?->?System.out.println(k?+?"="?+?v));
          }

          getOrDefault()

          該方法跟Lambda表達(dá)式?jīng)]關(guān)系,但是很有用。方法簽名為V getOrDefault(Object key, V defaultValue),作用是按照給定的key查詢Map中對應(yīng)的value,如果沒有找到則返回defaultValue。使用該方法程序員可以省去查詢指定鍵值是否存在的麻煩.
          需求;假設(shè)有一個數(shù)字到對應(yīng)英文單詞的Map,輸出4對應(yīng)的英文單詞,如果不存在則輸出NoValue

          //?查詢Map中指定的值,不存在時使用默認(rèn)值
          HashMap?map?=?new?HashMap<>();
          map.put(1,?"one");
          map.put(2,?"two");
          map.put(3,?"three");
          //?Java7以及之前做法
          if(map.containsKey(4)){?//?1
          ????System.out.println(map.get(4));
          }else{
          ????System.out.println("NoValue");
          }
          //?Java8使用Map.getOrDefault()
          System.out.println(map.getOrDefault(4,?"NoValue"));?//?2

          putIfAbsent() 該方法跟Lambda表達(dá)式?jīng)]關(guān)系,但是很有用。方法簽名為V putIfAbsent(K key, V value),作用是只有在不存在key值的映射或映射值為null時,才將value指定的值放入到Map中,否則不對Map做更改.該方法將條件判斷和賦值合二為一,使用起來更加方便.

          remove()

          我們都知道Map中有一個remove(Object key)方法,來根據(jù)指定key值刪除Map中的映射關(guān)系;Java8新增了remove(Object key, Object value)方法,只有在當(dāng)前Map中key正好映射到value時才刪除該映射,否則什么也不做.

          replace()

          在Java7及以前,要想替換Map中的映射關(guān)系可通過put(K key, V value)方法實現(xiàn),該方法總是會用新值替換原來的值.為了更精確的控制替換行為,Java8在Map中加入了兩個replace()方法,分別如下:
          • replace(K key, V value),只有在當(dāng)前Map中key的映射存在時才用value去替換原來的值,否則什么也不做.
          • replace(K key, V oldValue, V newValue),只有在當(dāng)前Map中key的映射存在且等于oldValue時才用newValue去替換原來的值,否則什么也不做.
          replaceAll() 該方法簽名為replaceAll(BiFunction function),作用是對Map中的每個映射執(zhí)行function指定的操作,并用function的執(zhí)行結(jié)果替換原來的value,其中BiFunction是一個函數(shù)接口,里面有一個待實現(xiàn)方法R apply(T t, U u).不要被如此多的函數(shù)接口嚇到,因為使用的時候根本不需要知道他們的名字.
          需求:假設(shè)有一個數(shù)字到對應(yīng)英文單詞的Map,請將原來映射關(guān)系中的單詞都轉(zhuǎn)換成大寫.
          Java7以及之前經(jīng)典的代碼如下:

          //?Java7以及之前替換所有Map中所有映射關(guān)系
          HashMap?map?=?new?HashMap<>();
          map.put(1,?"one");
          map.put(2,?"two");
          map.put(3,?"three");
          for(Map.Entry?entry?:?map.entrySet()){
          ????entry.setValue(entry.getValue().toUpperCase());
          }

          使用replaceAll()方法結(jié)合匿名內(nèi)部類,實現(xiàn)如下:

          //?使用replaceAll()結(jié)合匿名內(nèi)部類實現(xiàn)
          HashMap?map?=?new?HashMap<>();
          map.put(1,?"one");
          map.put(2,?"two");
          map.put(3,?"three");
          map.replaceAll(new?BiFunction(){
          ????@Override
          ????public?String?apply(Integer?k,?String?v){
          ????????return?v.toUpperCase();
          ????}
          });

          上述代碼調(diào)用replaceAll()方法,并使用匿名內(nèi)部類實現(xiàn)BiFunction接口。更進(jìn)一步的,使用Lambda表達(dá)式實現(xiàn)如下:

          //?使用replaceAll()結(jié)合Lambda表達(dá)式實現(xiàn)
          HashMap?map?=?new?HashMap<>();
          map.put(1,?"one");
          map.put(2,?"two");
          map.put(3,?"three");
          map.replaceAll((k,?v)?->?v.toUpperCase());

          簡潔到讓人難以置信.

          merge()

          該方法簽名為merge(K key, V value, BiFunction remappingFunction),作用是:
          • 如果Map中key對應(yīng)的映射不存在或者為null,則將value(不能是null)關(guān)聯(lián)到key上;
          • 否則執(zhí)行remappingFunction,如果執(zhí)行結(jié)果非null則用該結(jié)果跟key關(guān)聯(lián),否則在Map中刪除key的映射.
          參數(shù)中BiFunction函數(shù)接口前面已經(jīng)介紹過,里面有一個待實現(xiàn)方法R apply(T t, U u).
          merge()方法雖然語義有些復(fù)雜,但該方法的用方式很明確,一個比較常見的場景是將新的錯誤信息拼接到原來的信息上,比如:

          map.merge(key,?newMsg,?(v1,?v2)?->?v1+v2);

          compute()

          該方法簽名為compute(K key, BiFunction remappingFunction),作用是把remappingFunction的計算結(jié)果關(guān)聯(lián)到key上,如果計算結(jié)果為null,則在Map中刪除key的映射.
          要實現(xiàn)上述merge()方法中錯誤信息拼接的例子,使用compute()代碼如下:

          map.compute(key,?(k,v)?->?v==null???newMsg?:?v.concat(newMsg));

          computeIfAbsent()

          該方法簽名為V computeIfAbsent(K key, Function mappingFunction),作用是:只有在當(dāng)前Map中不存在key值的映射或映射值為null時,才調(diào)用mappingFunction,并在mappingFunction執(zhí)行結(jié)果非null時,將結(jié)果跟key關(guān)聯(lián).
          Function是一個函數(shù)接口,里面有一個待實現(xiàn)方法R apply(T t).
          computeIfAbsent()常用來對Map的某個key值建立初始化映射.比如我們要實現(xiàn)一個多值映射,Map的定義可能是Map>,要向Map中放入新值,可通過如下代碼實現(xiàn):

          Map>?map?=?new?HashMap<>();
          //?Java7及以前的實現(xiàn)方式
          if(map.containsKey(1)){
          ????map.get(1).add("one");
          }else{
          ????Set?valueSet?=?new?HashSet();
          ????valueSet.add("one");
          ????map.put(1,?valueSet);
          }
          //?Java8的實現(xiàn)方式
          map.computeIfAbsent(1,?v?->?new?HashSet()).add("yi");

          使用computeIfAbsent()將條件判斷和添加操作合二為一,使代碼更加簡潔.

          computeIfPresent()

          該方法簽名為V computeIfPresent(K key, BiFunction remappingFunction),作用跟computeIfAbsent()相反,即,只有在當(dāng)前Map中存在key值的映射且非null時,才調(diào)用remappingFunction,如果remappingFunction執(zhí)行結(jié)果為null,則刪除key的映射,否則使用該結(jié)果替換key原來的映射.
          這個函數(shù)的功能跟如下代碼是等效的:

          //?Java7及以前跟computeIfPresent()等效的代碼
          if?(map.get(key)?!=?null)?{
          ????V?oldValue?=?map.get(key);
          ????V?newValue?=?remappingFunction.apply(key,?oldValue);
          ????if?(newValue?!=?null)
          ????????map.put(key,?newValue);
          ????else
          ????????map.remove(key);
          ????return?newValue;
          }
          return?null;

          推薦閱讀:

          idea永久注冊碼來了?。。。ㄖС?020.3.1版本)

          Spring 自定義注解玩法大全,從入門到…

          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號內(nèi)回復(fù)「2048」,即可免費(fèi)獲?。?!

          微信掃描二維碼,關(guān)注我的公眾號

          朕已閱?

          瀏覽 33
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  一级做a爰片久久毛片A片 9 1? | 另类日韩欧美激情视频 | 亚洲无码论坛 | 久久久无码电影 | 亚洲淫色视频。 |