国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 基于Map的computeIfAbsent的使用場景和使用方式

基于Map的computeIfAbsent的使用場景和使用方式

2021-12-16 13:06飯飯ing Java教程

這篇文章主要介紹了基于Map的computeIfAbsent的使用場景和使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Map的computeIfAbsent使用場景和方法

?
1
2
3
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
    ...
}

我們在復(fù)雜map操作(put操作)時候有的時候不知道此時當(dāng)前key對應(yīng)的value值是否存在,這里,我們?nèi)绻褂贸R?guī)的代碼編寫,代碼量比較大

例如我們定義一個場景:存在一個數(shù)組,我們需要將當(dāng)前數(shù)組中相同的數(shù)存儲到一個對應(yīng)List集合中

常規(guī)實現(xiàn)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Test
public void test02() {
    //復(fù)雜map的使用場景:首先我們說復(fù)雜map,即map的value值為一個list集合或者是一個Set集合,對象或者是其他的集合
    //給定一個場景:現(xiàn)在存在一個數(shù)組,我們需要將當(dāng)前數(shù)組中相同的數(shù)存儲到一個對應(yīng)List集合中
    int[] nums = {1,2,3,1,3,4,6,7,9,9,1,3,4,5};
    Map<Integer, List<Integer>> map = new HashMap<>();
    //普通的寫法
    for (int i = 0; i < nums.length; i++) {
        if (!map.containsKey(nums[i])) {
            ArrayList<Integer> list = new ArrayList<>();
            list.add(nums[i]);
            map.put(nums[i],list);
        }else {
            map.get(nums[i]).add(nums[i]);
        }
    }
    map.forEach((key,value) -> {
        System.out.print(key + ": ");
        System.out.println(value);
    });
}

使用computeIfAbsent方法實現(xiàn)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Test
public void  test03() {
    int[] nums = {1,2,3,1,3,4,6,7,9,9,1,3,4,5};
    Map<Integer, List<Integer>> map = new HashMap<>();
    //我們使用map的computeIfAbsent解決
    for (int i = 0; i < nums.length; i++) {
        //返回值是該key對應(yīng)的集合list
        map.computeIfAbsent(nums[i], key -> new ArrayList<Integer>());
        map.get(nums[i]).add(nums[i]);
    }
 
    map.forEach((key,value) -> {
        System.out.print(key + ": ");
        System.out.println(value);
    });
}

輸出結(jié)果:

1: [1, 1, 1]
2: [2]
3: [3, 3, 3]
4: [4, 4]
5: [5]
6: [6]
7: [7]
9: [9, 9]

Map中computeIfAbsent() 的作用和底層實現(xiàn)

一、computeIfAbsent() 的作用

最近在開發(fā)中,發(fā)現(xiàn)同事經(jīng)常使用Map的computeIfAbsent()方法進行編程,于是對他的實現(xiàn)和作用產(chǎn)生了小興趣,下面用兩個demo案例來簡單介紹一下它的作用,然后再對底層實現(xiàn)進行進一步閱讀。

基于Map的computeIfAbsent的使用場景和使用方式

作用:判斷一個map中是否存在這個key,如果存在則處理value的數(shù)據(jù),如果不存在,則創(chuàng)建一個滿足value要求的數(shù)據(jù)結(jié)構(gòu)放到value中。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TestComputeIfAbsent {
  static HashMap<String, Set<String>> hashMap = new HashMap<>();
  public static void main(String[] args) {
    Set<String> set = new HashSet<>();
    set.add("zhangSan");
    hashMap.put("china", set);
    // 判斷map中是否存在,如果存在則添加元素到set中,如果不存在則新建set添加到hashMap中
    if(hashMap.containsKey("china")) {
      hashMap.get("china").add("liSi");
    } else {
      Set<String> setTmp = new HashSet<>();
      setTmp.add("liSi");
      hashMap.put("china", setTmp);
    }
    System.out.println(hashMap.toString());
  }

在使用了Map的computeIfAbsent() 方法后,使用后以上代碼變成了下面的形式(便捷、高效、代碼更加優(yōu)美,但可閱讀性降低):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TestComputeIfAbsent {
  static HashMap<String, Set<String>> hashMap = new HashMap<>();
  public static void main(String[] args) {
    Set<String> set = new HashSet<>();
    set.add("zhangSan");
    hashMap.put("china", set);
    // after JDK1.8
    hashMap.computeIfAbsent("china", key -> getValues(key)).add("liSi");
    System.out.println(hashMap.toString());
  }
 
  public static HashSet getValues(String key) {
    return new HashSet();
  }
}

hashMap.computeIfAbsent(“china”, key -> getValues(key)).add(“liSi”);的意思表示key為“China”的建值對是否存在,返回的是value的值。

如果存在則獲取china的值,并操作值的set添加數(shù)據(jù)“lisi"。

如果不存在,則調(diào)用方法,新創(chuàng)建set結(jié)構(gòu),將"lisi"添加到set中,再存入到hashMap中。

二、computeIfAbsent() 的源碼實現(xiàn)

這個方法是JDK8中Map類新增的一個方法,用來實現(xiàn)當(dāng)一個KEY的值缺失的時候,使用給定的映射函數(shù)重新計算填充KEY的值并返回結(jié)果。computeIfAbsent 方法的JDK源碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
    Objects.requireNonNull(mappingFunction);
    V v;
    // 嘗試獲取KEY的值,如果獲取不到KEY
    if ((v = get(key)) == null) {
        V newValue;
        // 利用傳入的計算函數(shù),得到新的值
        if ((newValue = mappingFunction.apply(key)) != null) {
            // 將KEY的值填充為函數(shù)計算的結(jié)果
            put(key, newValue);
            // 返回計算的結(jié)果
            return newValue;
        }
    }
    // 如果KEY的值存在,則直接返回
    return v;
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/SmallPig_Code/article/details/119647864

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
主站蜘蛛池模板: 中文字幕91视频 | 一本黄色片 | 精品一区二区三区中文字幕 | 在线观看亚洲区 | 国产精品久久久久白丝呻吟 | 亚洲免费在线播放 | 免费视频一区二区 | 久久久精品亚洲 | 国产黄色av | 国产午夜精品一区二区三区嫩草 | 国产高清一 | 一区二区三区 在线 | 亚洲一级黄色 | 久久最新 | 亚洲夜幕久久日韩精品一区 | 亚洲综合色网 | 国产激情在线观看 | 中文字幕免费看 | concern超碰在线 | 精品日韩 | 免费一级毛片观看 | 人人草人人干 | 丁香综合 | 亚洲国产精品久久 | 色香阁99久久精品久久久 | 精品黄色国产 | av网址在线播放 | 亚洲国产成人av | 欧美日韩在线一区二区三区 | 日韩欧美一区二区三区免费观看 | 亚洲成av人片在线观看无 | 国产精品无码永久免费888 | 日韩一区二区视频在线 | 爱逼色 | 久久国产一区二区 | 91在线一区 | 人人爱人人射 | 欧美日韩在线免费观看 | 成人精品网站在线观看 | 不卡免费在线视频 | 国产电影一区二区 |