中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中merge()函數如何使用

發布時間:2021-07-12 09:53:43 來源:億速云 閱讀:901 作者:Leah 欄目:編程語言

Java中merge()函數如何使用,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

merge() 怎么用?

假設我們有這么一段業務邏輯,我有一個學生成績對象的列表,對象包含學生姓名、科目、科目分數三個屬性,要求求得每個學生的總成績。加入列表如下:

private List<StudentScore> buildATestList() {         List<StudentScore> studentScoreList = new ArrayList<>();         StudentScore studentScore1 = new StudentScore() {{             setStuName("張三");             setSubject("語文");             setScore(70);         }};         StudentScore studentScore2 = new StudentScore() {{             setStuName("張三");             setSubject("數學");             setScore(80);         }};         StudentScore studentScore3 = new StudentScore() {{             setStuName("張三");             setSubject("英語");             setScore(65);         }};         StudentScore studentScore4 = new StudentScore() {{             setStuName("李四");             setSubject("語文");             setScore(68);         }};         StudentScore studentScore5 = new StudentScore() {{             setStuName("李四");             setSubject("數學");             setScore(70);         }};         StudentScore studentScore6 = new StudentScore() {{             setStuName("李四");             setSubject("英語");             setScore(90);         }};         StudentScore studentScore7 = new StudentScore() {{             setStuName("王五");             setSubject("語文");             setScore(80);         }};         StudentScore studentScore8 = new StudentScore() {{             setStuName("王五");             setSubject("數學");             setScore(85);         }};         StudentScore studentScore9 = new StudentScore() {{             setStuName("王五");             setSubject("英語");             setScore(70);         }};          studentScoreList.add(studentScore1);         studentScoreList.add(studentScore2);         studentScoreList.add(studentScore3);         studentScoreList.add(studentScore4);         studentScoreList.add(studentScore5);         studentScoreList.add(studentScore6);         studentScoreList.add(studentScore7);         studentScoreList.add(studentScore8);         studentScoreList.add(studentScore9);          return studentScoreList;     }

我們先看一下常規做法:

 ObjectMapper objectMapper = new ObjectMapper();         List<StudentScore> studentScoreList = buildATestList();          Map<String, Integer> studentScoreMap = new HashMap<>();         studentScoreList.forEach(studentScore -> {             if (studentScoreMap.containsKey(studentScore.getStuName())) {                 studentScoreMap.put(studentScore.getStuName(),                                      studentScoreMap.get(studentScore.getStuName()) + studentScore.getScore());             } else {                 studentScoreMap.put(studentScore.getStuName(), studentScore.getScore());             }         });          System.out.println(objectMapper.writeValueAsString(studentScoreMap));  // 結果如下: // {"李四":228,"張三":215,"王五":235}

然后再看一下 merge() 是怎么做的:

 Map<String, Integer> studentScoreMap2 = new HashMap<>();         studentScoreList.forEach(studentScore -> studentScoreMap2.merge(           studentScore.getStuName(),           studentScore.getScore(),           Integer::sum));          System.out.println(objectMapper.writeValueAsString(studentScoreMap2));  // 結果如下: // {"李四":228,"張三":215,"王五":235}

merge() 簡介

merge() 可以這么理解:它將新的值賦值到 key (如果不存在)或更新給定的key 值對應的 value,其源碼如下:

default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {        Objects.requireNonNull(remappingFunction);        Objects.requireNonNull(value);        V oldValue = this.get(key);        V newValue = oldValue == null ? value : remappingFunction.apply(oldValue, value);        if (newValue == null) {            this.remove(key);        } else {            this.put(key, newValue);        }         return newValue;    }

我們可以看到原理也是很簡單的,該方法接收三個參數,一個 key 值,一個 value,一個 remappingFunction  ,如果給定的key不存在,它就變成了 put(key, value) 。

但是,如果 key 已經存在一些值,我們 remappingFunction 可以選擇合并的方式,然后將合并得到的 newValue 賦值給原先的  key。

使用場景

這個使用場景相對來說還是比較多的,比如分組求和這類的操作,雖然 stream 中有相關 groupingBy()  方法,但如果你想在循環中做一些其他操作的時候,merge() 還是一個挺不錯的選擇的。

其他

除了 merge() 方法之外,我還看到了一些Java 8 中 map 相關的其他方法,比如 putIfAbsent 、compute()  、computeIfAbsent()  、computeIfPresent,這些方法我們看名字應該就知道是什么意思了,故此處就不做過多介紹了,感興趣的可以簡單閱讀一下源碼(都還是挺易懂的),這里我們貼一下  compute()(Map.class) 的源碼,其返回值是計算后得到的新值:

default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {        Objects.requireNonNull(remappingFunction);        V oldValue = this.get(key);        V newValue = remappingFunction.apply(key, oldValue);        if (newValue == null) {            if (oldValue == null && !this.containsKey(key)) {                return null;            } else {                this.remove(key);                return null;            }        } else {            this.put(key, newValue);            return newValue;        }    }

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

田阳县| 康定县| 连云港市| 天长市| 井陉县| 海阳市| 黎城县| 四川省| 通州市| 吉首市| 永善县| 冀州市| 蛟河市| 永定县| 随州市| 湖南省| 永仁县| 福贡县| 嵩明县| 吉木萨尔县| 张家川| 曲阜市| 饶平县| 龙南县| 板桥市| 裕民县| 新邵县| 阿鲁科尔沁旗| 海城市| 略阳县| 英山县| 台北县| 景洪市| 乌拉特中旗| 古浪县| 雅安市| 康平县| 鄢陵县| 中方县| 北海市| 武宣县|