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

Map 只會 put、get?快來學這幾個“新”方法

開發 前端
目前JDK的最新LTS版本已經更新到21了,這幾個在JDK8引入的Map”新“方法其實也是”老“方法了,還沒熟練使用也太out了,快來看看你都”學廢“了嗎?

引子

Map的數據操作,你是不是還只會put、get?

Map是我們日常編程中十分常用的數據接口,的在JDK8中,Map引入了幾個新方法,可以簡化我們對Map中數據的操作。

目前JDK的最新LTS版本已經更新到21了,這幾個在JDK8引入的Map”新“方法其實也是”老“方法了,還沒熟練使用也太out了,快來看看你都”學廢“了嗎?

getOrDefault

這個方法名很直觀,見名知意:嘗試獲取key對應的值,如果未獲取到,就返回默認值。

看一個使用的例子,新寫法會比老寫法更加簡潔:

private static void testGetOrDefault() {
    Map<String, String> map = new HashMap<>(4);
    map.put('123', '123');
    String key = 'key';
    String defaultValue = 'defaultValue';

    // 老寫法
    String oldValue = defaultValue;
    if (map.containsKey(key)) {
        oldValue = map.get(key);
    }
    System.out.println('oldValue = ' + oldValue);

    // 新寫法
    String newValue = map.getOrDefault(key, defaultValue);
    System.out.println('newValue = ' + newValue);
}

foreach

看方法名也可以知道,這個方法是遍歷map的數據使用的。

如果沒有foreach,我們遍歷map的時候一般是使用增強for循環,有了這個方法后,可以更加方便使用entry中的key和val:

private static void testForeach() {
    Map<String, String> map = new HashMap<>(4);
    map.put('123', '123');

    // 老寫法
    for (Map.Entry<String, String> entry : map.entrySet()) {
        System.out.printf('老寫法 key = %s, value = %s%n', entry.getKey(), entry.getValue());
    }

    // 新寫法
    map.forEach((key, value) -> System.out.printf('新寫法 key = %s, value = %s%n', key, value));
}

merge

從名字可以想到,是合并entry使用的,但是具體是怎么合并呢?

看一下日常最常用的Map實現類HashMap對merge方法的實現

@Override
public V merge(K key, V value,
               BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
    if (value == null || remappingFunction == null)
        throw new NullPointerException();
    int hash = hash(key);
    Node<K,V>[] tab; Node<K,V> first; int n, i;
    int binCount = 0;
    TreeNode<K,V> t = null;
    Node<K,V> old = null;
    if (size > threshold || (tab = table) == null ||
        (n = tab.length) == 0)
        n = (tab = resize()).length;
    if ((first = tab[i = (n - 1) & hash]) != null) {
        if (first instanceof TreeNode)
            old = (t = (TreeNode<K,V>)first).getTreeNode(hash, key);
        else {
            Node<K,V> e = first; K k;
            do {
                if (e.hash == hash &&
                    ((k = e.key) == key || (key != null && key.equals(k)))) {
                    old = e;
                    break;
                }
                ++binCount;
            } while ((e = e.next) != null);
        }
    }
    if (old != null) {
        V v;
        if (old.value != null) {
            int mc = modCount;
            v = remappingFunction.apply(old.value, value);
            if (mc != modCount) {
                throw new ConcurrentModificationException();
            }
        } else {
            v = value;
        }
        if (v != null) {
            old.value = v;
            afterNodeAccess(old);
        }
        else
            removeNode(hash, key, null, false, true);
        return v;
    } else {
        if (t != null)
            t.putTreeVal(this, tab, hash, key, value);
        else {
            tab[i] = newNode(hash, key, value, first);
            if (binCount >= TREEIFY_THRESHOLD - 1)
                treeifyBin(tab, hash);
        }
        ++modCount;
        ++size;
        afterNodeInsertion(true);
        return value;
    }
}

代碼比較長,但是實現的效果比較容易描述:這個方法接收3個參數:key、value、function。

  • 如果key存在,將value按照function做1次計算后,更新到Map中
  • 如果key不存在,將key-value放入Map中

這個方法在某些場景中挺好用的,代碼簡潔易懂,例如:我們有1個List,要統計List中每個元素出現的次數。我們要實現的邏輯是,遍歷List中的每個元素,如果這個元素在Map中存在,Map中的值+1;如果不存在,則放入Map中,次數(值)為1。

private static void testMerge() {
    Map<String, Integer> cntMap = new HashMap<>(8);
    List<String> list = Arrays.asList('apple', 'orange', 'banana', 'orange');

    // 老寫法
    for (String item : list) {
        if (cntMap.containsKey(item)) {
            cntMap.put(item, cntMap.get(item) + 1);
        } else {
            cntMap.put(item, 1);
        }
    }

    // 新寫法
    for (String item : list) {
        cntMap.merge(item, 1, Integer::sum);
    }
}

可以看到我們使用merge方法的話,只用1行就簡潔實現了這個邏輯。

putIfAbsent

也是一個見名知意的方法:不存在key或者值為null時,才將鍵值對放入Map。跟put方法相比,這個方法不會直接覆蓋已有的值,在不允許覆蓋舊值的場景使用起來會比較簡潔。

private static void testPutIfAbsent() {
    Map<String, Integer> scoreMap = new HashMap<>(4);
    scoreMap.put('Jim', 88);
    scoreMap.put('Lily', 90);

    // 老寫法
    if (!scoreMap.containsKey('Lily')) {
        scoreMap.put('Lily', 98);
    }

    // 新寫法
    scoreMap.putIfAbsent('Lily', 98);
}

computer

computer方法需要傳入2個參數:key、function。主要有3步操作

  • 獲取到key對應的oldValue,可能為null
  • 經過function計算獲取newValue
  • put(key, newValue)

還是以剛剛統計單次次數需求為例,看一下computer的寫法:

private static void testComputer() {
    Map<String, Integer> cntMap = new HashMap<>(8);
    List<String> list = Arrays.asList('apple', 'orange', 'banana', 'orange');

    // 老寫法
    for (String item : list) {
        if (cntMap.containsKey(item)) {
            cntMap.put(item, cntMap.get(item) + 1);
        } else {
            cntMap.put(item, 1);
        }
    }

    // 新寫法
    for (String item : list) {
        cntMap.compute(item, (k, v) -> {
            if (v == null) {
                v = 1;
            } else {
                v += 1;
            }
            return v;
        });
    }
}

computeIfAbsent

看名字就知道是compute方法衍生出來的方法,這個方法只在key不存在的時候,執行computer計算,如果說key對應的value存在,就直接返回這個value。

例如,我們需要計算斐波那鍥數列的時候,可以使用這個方法來簡化代碼:

private static void testComputerIfAbsent() {
    Map<Integer, Integer> fabMap = new ConcurrentHashMap<>(16);
    fabMap.put(0, 1);
    fabMap.put(1, 1);
    System.out.println(fab(5, fabMap));
}

private static Integer fab(Integer index, Map<Integer, Integer> fabMap) {
    return fabMap.computeIfAbsent(index, i -> fab(i - 2, fabMap) + fab(i - 1, fabMap));
}

computeIfPresent

這個是computeIfAbsent的姊妹方法,區別在于,這個方法是只有key存在的時候,才去執行computer計算和值的更新。

replace

這個方法的效果是:

  • 如果key存在,則更新值
  • 如果key不存在,什么也不做
責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2021-09-15 16:05:41

map.putJavaMap

2020-05-20 16:54:47

數據分頁顯示函數

2022-05-27 08:44:09

springStarter配置

2020-09-18 06:48:21

Python編程語言

2025-09-03 09:10:00

編程AI模型

2023-10-07 08:59:02

2020-07-03 18:14:20

JavaScript開發技術

2019-02-28 20:20:43

Python技巧編程語言

2021-06-11 13:59:22

CSS原子類

2021-10-27 10:07:59

GitHub代碼開發者

2020-02-03 09:29:32

JavaScript代碼斷點

2024-07-01 08:31:14

Spring工具類代碼

2023-11-30 08:19:52

偽類CSS

2022-05-20 15:27:41

React工具Vue

2022-12-22 08:57:29

Redis數據存儲

2020-03-06 10:54:51

Go語言XML算法

2018-06-19 16:25:40

編程語言Python爬蟲

2022-04-12 08:43:21

Python內置模塊

2022-11-28 10:24:10

Spring更新JVM

2022-05-31 09:42:49

工具編輯器
點贊
收藏

51CTO技術棧公眾號

激情无码人妻又粗又大| 欧美激情国产精品日韩| 免费观看国产视频| 日韩av网站在线观看| 久久久精品国产网站| 三级网站免费看| 涩涩涩视频在线观看| 中文字幕精品一区二区精品绿巨人| 成人免费直播live| 日本网站在线播放| 91亚洲国产| 亚洲黄色片网站| 日韩在线不卡一区| 欧美gv在线| 亚洲欧美视频在线观看视频| 欧美极品色图| 99视频在线观看免费| 亚洲中字黄色| 欧美激情视频一区二区| www.日本高清视频| 欧美18xxxx| 91精品久久久久久久久99蜜臂| 97国产在线播放| 成人黄视频在线观看| 2023国产精品| 国产精品免费区二区三区观看| 国产精品成人无码| 亚洲韩日在线| 久久99热这里只有精品国产 | 日韩在线成人| 欧美久久久久中文字幕| 国产精品-区区久久久狼| 天堂av最新在线| 亚洲天堂2016| 亚洲激情一区二区三区| 青青草视频在线免费观看| 国产精品99久| 成人免费自拍视频| 岳乳丰满一区二区三区| 日本亚洲三级在线| 日本久久久久久久久| 日韩欧美高清在线观看| 欧美三级小说| 九九九久久国产免费| 182在线观看视频| 色999日韩| 自拍偷拍亚洲在线| 亚洲AV成人无码网站天堂久久| 免费电影一区二区三区| 亚洲欧美精品一区| 深爱五月激情网| 日本天堂一区| 亚洲美女喷白浆| 粉嫩av蜜桃av蜜臀av| 欧美精品中文| 亚洲人成欧美中文字幕| av黄色免费网站| 欧洲福利电影| 精品国内亚洲在观看18黄 | 国产精品观看在线亚洲人成网| 欧美三级一区二区三区| 久久av最新网址| 国产成人久久久| 一级α片免费看刺激高潮视频| 麻豆极品一区二区三区| 成人久久久久久久| 精品二区在线观看| 成人动漫精品一区二区| 久久精品国产一区二区三区日韩| 天堂视频中文在线| 亚洲国产精品t66y| 99亚洲精品视频| 丁香花在线观看完整版电影| 精品动漫一区二区| 久久精品网站视频| 日韩免费在线电影| 日韩午夜激情av| 好吊一区二区三区视频| av中文一区| 久久成人人人人精品欧| 国产手机在线视频| 日日噜噜夜夜狠狠视频欧美人| 国产精品尤物福利片在线观看| 国产美女免费看| 成人国产精品免费观看视频| 欧美在线播放一区| 超碰在线无需免费| 欧美日韩免费在线| 天天爽人人爽夜夜爽| 精品一区二区三区中文字幕在线| 亚洲精品一区二区三区福利 | 91禁外国网站| 中文字幕激情视频| 成人黄色网址在线观看| 亚洲成色www久久网站| 日韩伦理av| 欧洲精品一区二区三区在线观看| 色男人天堂av| 欧美精品尤物在线观看| 欧美黄色三级网站| 国产情侣小视频| 国产一区二区伦理| 青青草国产精品| 日本欧美电影在线观看| 欧美综合久久久| www.日本高清| 欧美视频四区| 91精品国产综合久久香蕉最新版| 日本激情视频网站| ㊣最新国产の精品bt伙计久久| 伊人成色综合网| 国产精品国产亚洲精品| 国产亚洲视频在线| 日产电影一区二区三区| 国产一区在线看| 色涩成人影视在线播放| 密臀av在线播放| 日韩精品在线网站| 日韩精品123区| 日韩主播视频在线| 久久天堂国产精品| 久草在线资源站资源站| 这里只有精品免费| 国精产品一区一区| 久久成人国产| 免费精品视频一区| 99re6在线精品视频免费播放| 欧美二区三区91| 后入内射无码人妻一区| 日韩av不卡一区二区| 欧美xxxx黑人又粗又长精品| 激情影院在线| 日韩欧美一级片| 欧美做爰啪啪xxxⅹ性| 蜜臀久久99精品久久久画质超高清| 久久久久久久久久久久久9999| 人妖欧美1区| 日韩欧美电影一区| 91视频综合网| 国产成人福利片| 4444在线观看| 亚洲国产高清在线观看| 欧美猛交ⅹxxx乱大交视频| 国产三级在线观看视频| 亚洲欧美精品午睡沙发| 亚洲欧美天堂在线| 亚洲一区二区日韩| 91手机在线观看| 波多野结衣中文在线| 精品国产免费一区二区三区四区| 久草成人在线视频| 成人免费高清视频在线观看| 无码av天堂一区二区三区| 99a精品视频在线观看| 欧美激情精品在线| 人妻精品一区二区三区| 亚洲成人午夜影院| 亚洲熟妇无码av| 另类综合日韩欧美亚洲| 老司机av福利| 91成人午夜| 68精品久久久久久欧美| 久久伊伊香蕉| 欧美日韩视频专区在线播放| 中文字幕无码日韩专区免费| 国产伦精品一区二区三区免费迷 | 国产综合精品久久久久成人av| 丝袜美腿高跟呻吟高潮一区| 亚洲欧美在线网| 欧美大片91| 97av在线播放| av小片在线| 日韩亚洲欧美成人一区| 日本一区二区欧美| 国产亚洲一区二区三区在线观看| 欧美在线aaa| 欧美久久九九| 免费成人av网站| 国产精品国产三级在线观看| 97色在线观看免费视频| 国产中文在线观看| 欧美一区二区三区四区视频 | 在线观看视频一区| 182在线观看视频| 99国产欧美久久久精品| 少妇一级淫免费放| 国产精品v日韩精品v欧美精品网站 | 国产一区二区观看| 成人福利在线视频| 成人av影院在线观看| 夜夜嗨av色综合久久久综合网| 国产成人久久精品77777综合| 精品国产乱码久久久久久虫虫漫画| 亚洲а∨天堂久久精品2021| 国产精品一区在线观看你懂的| 久久久久人妻精品一区三寸| 中文字幕免费精品| 欧美一区二区三区成人久久片| 精品一区二区三区中文字幕在线| 欧美主播福利视频| a级影片在线观看| 亚洲欧洲国产一区| 丁香花免费高清完整在线播放| 欧美专区日韩专区| 国产手机在线视频| 亚洲精品欧美综合四区| 日韩精品电影一区二区三区| 成人精品视频一区二区三区尤物| 在线看的黄色网址| 中文高清一区| 久久久久久久久影视| 精品国产91| 久久久久九九九| av毛片精品| 91中文精品字幕在线视频| 日韩高清成人| 欧美在线观看视频| 国产在线拍揄自揄拍视频| 久久精品91久久香蕉加勒比| 国产中文字幕在线播放| 亚洲跨种族黑人xxx| 亚洲第一色网站| 欧美一区二区三区四区高清| 久久国产香蕉视频| 色视频成人在线观看免| 日韩av免费网址| 亚洲自拍另类综合| 亚洲欧美小视频| 亚洲欧美日韩国产成人精品影院| 91免费在线看片| 欧美激情在线观看视频免费| aaaaa级少妇高潮大片免费看| 99久久精品免费| 国产69视频在线观看| 成人毛片在线观看| 中文字幕在线国产| 成人一区二区三区中文字幕| 黑人无套内谢中国美女| 国产精品一区在线观看你懂的| 亚洲一区二区偷拍| 国产毛片精品国产一区二区三区| gai在线观看免费高清| 蜜臀久久久久久久| 91插插插插插插插插| 毛片av中文字幕一区二区| 一区二区三区视频在线观看免费| 免费成人在线影院| www.se五月| 国产麻豆成人精品| 国产精品99精品无码视亚| 高清国产午夜精品久久久久久| 欧美成人精品一区二区综合免费| 国产成人免费网站| 污污污www精品国产网站| 99久久免费国产| 国产美女精品久久| 日本一区二区三区dvd视频在线| 亚洲综合第一区| 亚洲少妇30p| 国产精品19乱码一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲精品在线观看av| 欧美日韩中文字幕在线视频| 国产一卡二卡三卡| 欧美精品tushy高清| 亚洲av无码国产综合专区 | 成人精品网站在线观看| 中文在线综合| 欧美另类一区| 亚洲国产老妈| 我的公把我弄高潮了视频| 噜噜噜在线观看免费视频日韩| 亚洲天堂网一区| 国产成人久久精品77777最新版本| www国产视频| 欧美高清在线一区二区| 99热精品免费| 欧美日韩性视频在线| 伊人久久成人网| 精品国产电影一区二区| 男人的天堂在线免费视频| 日韩有码在线观看| 国产va在线视频| 国产精品丝袜久久久久久高清| 日韩免费成人| 欧美一卡2卡3卡4卡无卡免费观看水多多| 成人激情在线| 成人免费视频91| 久久国产尿小便嘘嘘| 又黄又爽的网站| 国产精品欧美久久久久一区二区| 免看一级a毛片一片成人不卡| 色婷婷激情综合| 精品国产乱码一区二区三 | 欧美日韩高清一区二区三区| 后入内射欧美99二区视频| 在线播放日韩av| 91福利在线免费| 91久久嫩草影院一区二区| 婷婷成人在线| 国产精品久久国产| 麻豆精品在线播放| 双性尿奴穿贞c带憋尿| 亚洲欧美福利一区二区| 一级黄色av片| 亚洲第一二三四五区| 蜜桃视频在线观看www社区| 欧美整片在线观看| aaa国产精品| 91精品一区二区三区四区| 麻豆精品在线看| 国产三级av在线播放| 亚洲mv大片欧洲mv大片精品| 国产精品综合在线| 中文字幕国产精品| 老牛影视精品| 国产精品一区二区三区在线观| 91综合久久| 日韩免费高清在线| 91视频在线看| 香蕉视频一区二区| 精品欧美一区二区在线观看| 欧美一区二区三区| 国产精品入口尤物| 国产成人精品一区二区免费看京| 日日摸日日碰夜夜爽无码| 国产精品系列在线播放| 69夜色精品国产69乱| 欧美日韩国产三级| 在线免费观看黄| 国产精品免费一区豆花| 国产欧美久久一区二区三区| 欧美牲交a欧美牲交aⅴ免费下载| 成人午夜av电影| 国产一级特黄毛片| 精品第一国产综合精品aⅴ| 大片免费在线观看| 91网站在线免费观看| 91精品在线观看国产| 天美一区二区三区| 亚洲精品日韩综合观看成人91| 国产av无码专区亚洲av| 久久亚洲精品国产亚洲老地址| 24小时成人在线视频| 超碰免费在线公开| 国产美女精品一区二区三区| 欧美成人777| 欧美大胆人体bbbb| av电影免费在线看| 久久99久久99精品蜜柚传媒| 亚洲在线电影| 青娱乐国产视频| 欧美日韩国产a| 最新超碰在线| 国产偷国产偷亚洲高清97cao| 亚洲精品黄色| 亚洲精品成人无码熟妇在线| 色狠狠桃花综合| 91精品国产综合久久久久久豆腐| 91精品久久久久久久| 一区二区三区网站 | 国产日韩精品视频一区| 在线观看国产小视频| 久热在线中文字幕色999舞| 2020国产精品极品色在线观看| 国产美女主播在线播放 | 精品人妻伦九区久久aaa片| 欧美一级理论片| 国产亚洲成av人片在线观看| 欧美在线一区二区三区四区| 男女男精品网站| 青娱乐国产在线| 亚洲欧美在线播放| 亚州精品国产| 男人添女荫道口喷水视频| 久久综合九色综合97_久久久| 怡春院在线视频| 久久久久国产视频| 欧美日韩在线观看视频小说| 亚洲av无码久久精品色欲| 天天色天天操综合| 欧美13一16娇小xxxx| 国产欧美日韩综合一区在线观看 | 18成人在线| 久久久久久自在自线| 五月天色婷婷丁香| 国产视频自拍一区| 电影91久久久| 久久精品网站视频| 亚洲精品国产无套在线观| 久草视频在线看| 国产精品swag| 免费成人av在线| 欧美videossex极品| 欧美成人午夜激情视频| 欧美伦理影院| 少妇一级淫片免费放播放| 欧美精品乱人伦久久久久久| 桃色av一区二区| av日韩在线看|