最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java高效累加map中相同key對應(yīng)的Value值

 更新時間:2025年10月13日 08:39:23   作者:自由的瘋  
在Java中,對于??Map??中的相同鍵(key)進(jìn)行值(value)累加的操作是常見的需求之一,下面將詳細(xì)介紹幾種不同的方法來完成這一任務(wù),d大家可以根據(jù)需要進(jìn)行選擇

在Java中,對于??Map??中的相同鍵(key)進(jìn)行值(value)累加的操作是常見的需求之一。這種操作可以通過多種方式實現(xiàn),具體取決于你使用的Java版本以及你希望達(dá)到的效果。下面將詳細(xì)介紹幾種不同的方法來完成這一任務(wù),并引用相關(guān)資料中的信息。

使用??merge??方法(推薦)

從Java 8開始,??Map???接口引入了??merge??方法,它提供了一種便捷的方式來在鍵已經(jīng)存在的情況下合并值。此方法接收三個參數(shù):鍵、新值和一個用于處理沖突的函數(shù)。當(dāng)給定的鍵不存在時,該方法會簡單地將鍵與提供的新值關(guān)聯(lián)起來;如果鍵已經(jīng)存在,則調(diào)用提供的函數(shù)來計算新的值。例如:

Map<String, Integer> map = new HashMap<>();
map.merge("key1", 1, Integer::sum);
map.merge("key1", 2, Integer::sum); // 如果 "key1" 存在,則將其值更新為原值加上2
System.out.println(map); // 輸出: {key1=3}

這種方法不僅簡潔明了,而且避免了顯式檢查鍵是否存在或手動獲取舊值再進(jìn)行累加的操作。

使用??compute??方法

除了??merge???之外,??compute??也是一個非常有用的工具。它可以接受一個鍵和一個雙參數(shù)函數(shù)作為輸入,其中第一個參數(shù)是鍵本身,第二個參數(shù)是當(dāng)前映射到該鍵的值(如果沒有則為null)。根據(jù)這個函數(shù)返回的結(jié)果決定是否更新或插入新的鍵值對。對于累加的情況,你可以這樣寫:

map.compute("key1", (k, v) -> v == null ? 1 : v + 1);

這段代碼實現(xiàn)了與上面??merge???示例相同的功能,但是通過??compute??提供了更多的靈活性,因為它允許你在更復(fù)雜的情況下自定義如何處理鍵值對。

遍歷并累加

如果你有一個包含多個條目的集合,并且想要基于某些條件對這些條目進(jìn)行分組并累加它們的值,那么可以考慮使用流(Stream API)。例如,假設(shè)我們有一個??List<Map<String, Integer>>???,其中每個??Map??代表一行記錄,我們可以按照特定的鍵來聚合數(shù)據(jù):

List<Map<String, Integer>> list = Arrays.asList(
    Map.of("id", 1, "amount", 10),
    Map.of("id", 2, "amount", 20),
    Map.of("id", 1, "amount", 30)
);

Map<Integer, Integer> result = list.stream()
    .flatMap(m -> m.entrySet().stream())
    .filter(e -> "id".equals(e.getKey()) || "amount".equals(e.getKey()))
    .collect(Collectors.groupingBy(
        e -> Integer.parseInt(e.getValue().toString()),
        Collectors.summingInt(e -> "amount".equals(e.getKey()) ? e.getValue() : 0)
    ));

System.out.println(result); // 輸出: {1=40, 2=20}

這里我們首先將所有的??Map.Entry???展平成一個流,然后過濾出感興趣的字段(即??id???和??amount???),最后使用??Collectors.groupingBy???結(jié)合??Collectors.summingInt??來進(jìn)行分組和累加。

處理復(fù)雜類型

當(dāng)??Map???中的值不是簡單的數(shù)字而是更復(fù)雜的對象時,可能需要采取稍微不同的策略。例如,如果你有一個??Map<String, BigDecimal>??并且想對相同的鍵進(jìn)行累加,可以這樣做:

Map<String, BigDecimal> decimalMap = new HashMap<>();
list.forEach(data -> {
    String id = data.get("id").toString();
    BigDecimal amount = new BigDecimal(data.get("amount").toString());
    BigDecimal currentValue = decimalMap.get(id);
    if (currentValue != null) {
        decimalMap.put(id, currentValue.add(amount));
    } else {
        decimalMap.put(id, amount);
    }
});

這段代碼展示了如何遍歷一個列表并將每個元素的金額累加到相應(yīng)的鍵下。注意這里使用了??BigDecimal??來進(jìn)行精確的小數(shù)運算,這對于財務(wù)相關(guān)的應(yīng)用尤為重要。

方法補充

傳統(tǒng)遍歷累加方式

最直接的思路是遍歷 Map。示例代碼如下:

import java.util.HashMap;
import java.util.Map;

public class MapKeyAccumulate {
    public static void main(String[] args) {
        Map<String, Integer> productSales = new HashMap<>();
        productSales.put("Apple", 10);
        productSales.put("Banana", 5);
        productSales.put("Apple", productSales.get("Apple") + 15); 

        for (Map.Entry<String, Integer> entry : productSales.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

這段代碼手動處理了 Apple 鍵的累加,先獲取舊值再加新值更新回去。但如果數(shù)據(jù)量龐大、重復(fù)鍵眾多,這種逐一手動處理的方式極易出錯且效率低下,代碼也顯得冗長繁瑣。

利用 merge 方法(Java 8 及以上)

Java 8 引入的 merge 方法為這類問題提供了優(yōu)雅高效的解法。它能在鍵存在時合并值,鍵不存在時直接插入新鍵值對。示例如下:

import java.util.HashMap;
import java.util.Map;

public class MapMergeExample {
    public static void main(String[] args) {
        Map<String, Integer> productSales = new HashMap<>();
        productSales.put("Apple", 10);
        productSales.put("Banana", 5);

        // 新數(shù)據(jù)
        Map<String, Integer> newData = new HashMap<>();
        newData.put("Apple", 15);
        newData.put("Orange", 8);

        for (Map.Entry<String, Integer> entry : newData.entrySet()) {
            productSales.merge(entry.getKey(), entry.getValue(), Integer::sum);
        }

        productSales.forEach((key, value) -> System.out.println(key + ": " + value));
    }
}

在上述代碼中,merge 方法接收三個參數(shù):鍵、新值以及合并函數(shù)(這里用 Integer::sum 表示對兩個整數(shù)值求和)。當(dāng) productSales 中存在 merge 方法傳入的鍵時,就將該鍵對應(yīng)的值與新值按給定函數(shù)合并;若鍵不存在,就把新鍵值對插入 productSales。這樣無需復(fù)雜的條件判斷,一行代碼搞定累加邏輯,簡潔高效,尤其適用于動態(tài)添加數(shù)據(jù)并實時合并的場景。

使用 computeIfPresent 方法

computeIfPresent 方法也可用于處理相同鍵累加,它針對已存在的鍵執(zhí)行計算操作。示例:

import java.util.HashMap;
import java.util.Map;

public class MapComputeExample {
    public static void main(String[] args) {
        Map<String, Integer> productSales = new HashMap<>();
        productSales.put("Apple", 10);
        productSales.put("Banana", 5);

        Map<String, Integer> newData = new HashMap<>();
        newData.put("Apple", 15);
        newData.put("Orange", 8);

        newData.forEach((key, newValue) -> productSales.computeIfPresent(key, (k, oldValue) -> oldValue + newValue));
        productSales.putAll(newData);

        productSales.forEach((key, value) -> System.out.println(key + ": " + value));
    }
}

這里遍歷 newData,對于 productSales 中已有的鍵,通過 computeIfPresent 取出舊值與新值相加更新;遍歷結(jié)束后再用 putAll 插入新鍵值對(處理 newData 中不存在于 productSales 的鍵)。此方法靈活性高,可自定義復(fù)雜計算邏輯,不僅限于求和,如根據(jù)業(yè)務(wù)規(guī)則加權(quán)計算等。

總結(jié)

綜上所述,Java提供了多種方式來處理??Map???中相同鍵的值累加問題。對于現(xiàn)代Java開發(fā)而言,推薦優(yōu)先考慮??merge???或??compute??這樣的內(nèi)置方法,因為它們不僅簡化了代碼邏輯,還提高了程序的可讀性和維護(hù)性。而在面對更加復(fù)雜的場景時,則可以根據(jù)實際情況選擇最適合的方法。無論選擇哪種方法,都應(yīng)該確保你的解決方案能夠正確處理所有邊界情況,包括但不限于空值、不同類型的值以及并發(fā)訪問等問題.

到此這篇關(guān)于java高效累加map中相同key對應(yīng)的Value值的文章就介紹到這了,更多相關(guān)java累加map相同key的Value值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA 當(dāng)前在線人數(shù)和歷史訪問量的示例代碼

    IDEA 當(dāng)前在線人數(shù)和歷史訪問量的示例代碼

    這篇文章主要介紹了IDEA 當(dāng)前在線人數(shù)和歷史訪問量的實例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java線程的相關(guān)方法詳細(xì)解析

    Java線程的相關(guān)方法詳細(xì)解析

    以下是對Java線程的相關(guān)方法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下
    2013-09-09
  • Docker報錯pass store is uninitialized修復(fù)實現(xiàn)方式

    Docker報錯pass store is uninitialized修復(fù)實現(xiàn)方式

    文章介紹了如何在Linux系統(tǒng)上使用docker-credential-pass進(jìn)行Docker憑證管理的步驟,包括下載、安裝依賴、生成GPG密鑰、配置pass和docker-credential-pass,以及最終進(jìn)行Docker登錄
    2026-02-02
  • SpringMVC視圖作用詳解

    SpringMVC視圖作用詳解

    這篇文章主要介紹了springMVC中的視圖與視圖解析器,springMVC視圖的種類很多,默認(rèn)有轉(zhuǎn)發(fā)視圖和重定向視圖,本文就每一種視圖給大家詳細(xì)介紹,需要的朋友可以參考下
    2022-11-11
  • java maven進(jìn)階教學(xué)

    java maven進(jìn)階教學(xué)

    這篇文章主要介紹了Maven進(jìn)階教程的相關(guān)資料,文中講解非常細(xì)致,幫助大家開始學(xué)習(xí)maven,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-08-08
  • JDBC 程序的常見錯誤及調(diào)試方法

    JDBC 程序的常見錯誤及調(diào)試方法

    本文是《Java Web開發(fā)教程——入門與提高篇(JSP+Servlet)》一書《第9章 JDBC技術(shù)》的補充內(nèi)容。
    2009-06-06
  • java學(xué)生信息管理系統(tǒng)設(shè)計

    java學(xué)生信息管理系統(tǒng)設(shè)計

    這篇文章主要為大家詳細(xì)介紹了java學(xué)生信息管理系統(tǒng)設(shè)計,學(xué)生信息添加進(jìn)入數(shù)據(jù)庫的事務(wù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 基于Spring監(jiān)聽Binlog日志的方法詳解

    基于Spring監(jiān)聽Binlog日志的方法詳解

    MySQL 的二進(jìn)制日志(binlog)有三種不同的格式,通常被稱為 binlog 模式,這三種模式分別是 Statement 模式、Row 模式和Mixed 模式,本文將給大家介紹如何基于Spring監(jiān)聽Binlog日志,需要的朋友可以參考下
    2024-09-09
  • Java split函數(shù)拆分后變成null問題解決方案

    Java split函數(shù)拆分后變成null問題解決方案

    這篇文章主要介紹了Java split函數(shù)拆分后變成null問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • java線程池工作隊列飽和策略代碼示例

    java線程池工作隊列飽和策略代碼示例

    這篇文章主要介紹了java線程池工作隊列飽和策略代碼示例,涉及線程池的簡單介紹,工作隊列飽和策略的分析及代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論

安化县| 三原县| 江陵县| 东乌珠穆沁旗| 菏泽市| 沁阳市| 竹北市| 溆浦县| 武隆县| 隆昌县| 定结县| 定西市| 葵青区| 西吉县| 榆树市| 永年县| 伽师县| 绥江县| 大英县| 阿城市| 连南| 团风县| 武川县| 高平市| 邵阳市| 金华市| 五台县| 龙州县| 安义县| 会同县| 双辽市| 夏津县| 南部县| 正镶白旗| 岑溪市| 东港市| 津市市| 富民县| 榆中县| 鹿邑县| 周口市|