亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

萝北县| 横峰县| 资讯| 县级市| 资溪县| 宜宾县| 前郭尔| 固阳县| 同心县| 九江市| 玛曲县| 海伦市| 始兴县| 梨树县| 钦州市| 阿合奇县| 永安市| 什邡市| 博客| 天峻县| 辽源市| 盐池县| 天津市| 峨山| 临潭县| 丰都县| 常德市| 贺州市| 简阳市| 商水县| 郯城县| 龙岩市| 苗栗县| 平江县| 宜兰县| 连州市| 历史| 邳州市| 石门县| 海原县| 延吉市|