Java?Map初始化并賦值的幾種簡短寫法
需求背景:
今天需要給多用戶發(fā)送郵件,但是用戶信息是固定的且數(shù)量有限,索性直接寫死常量池,遍歷常量池進(jìn)行發(fā)郵件操作。設(shè)計(jì)階段考慮使用map進(jìn)行數(shù)據(jù)封裝賦值。為了使代碼簡潔直觀,調(diào)研了幾種Java Map初始化并賦值的語法。
由于我目前使用的還是java jdk1.8所以還是選擇第一種內(nèi)聯(lián)方式創(chuàng)建。
對(duì)于初始化一個(gè) Map 并直接賦值為常量的場景,可以使用以下幾種簡短寫法:
1. 直接內(nèi)聯(lián)創(chuàng)建并添加
如果只需要一個(gè) Map,可以直接在 list.add() 方法中初始化:
List<Map<String, String>> list = new ArrayList<>();
list.add(new HashMap<>() {{
put("companyName", "科技有限公司");
put("loginUrl", "https://www.baidu.com/");
put("bcc", "https://www.baidu.com/");
}});
- 優(yōu)點(diǎn):減少變量聲明。
- 缺點(diǎn):仍存在匿名內(nèi)部類問題。
2. 使用雙括號(hào)初始化 (僅推薦在測試或臨時(shí)場景中使用)
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> map = new HashMap<>() {{
put("companyName", "科技有限公司");
put("loginUrl", "https://www.baidu.com/");
put("bcc", "https://www.baidu.com/");
}};
list.add(map);
- 優(yōu)點(diǎn):寫法直觀,支持可變的
Map。 - 缺點(diǎn):
- 生成的匿名內(nèi)部類可能會(huì)導(dǎo)致內(nèi)存泄漏,不推薦在生產(chǎn)代碼中使用。
3. 使用 Map.of() (Java 9+)
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> map = Map.of(
"companyName", "科技有限公司",
"loginUrl", "https://www.baidu.com/",
"bcc", "https://www.baidu.com/"
);
list.add(map);
- 優(yōu)點(diǎn):代碼簡潔,不需要顯式調(diào)用
put方法。 - 限制:
Map.of()創(chuàng)建的Map是不可變的,不能再修改其內(nèi)容。
4. 使用 Map.ofEntries() (Java 9+)
適用于鍵值對(duì)超過 10 個(gè)的場景。
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> map = Map.ofEntries(
Map.entry("companyName", "科技有限公司"),
Map.entry("loginUrl", "https://www.baidu.com/"),
Map.entry("bcc", "https://www.baidu.com/")
);
list.add(map);
- 優(yōu)點(diǎn):支持更多鍵值對(duì)初始化。
- 限制:同樣生成的
Map是不可變的。
5. 使用工具類構(gòu)造
如果初始化 Map 是常見需求,可以封裝一個(gè)工具方法:
public static <K, V> Map<K, V> mapOf(Object... entries) {
Map<K, V> map = new HashMap<>();
for (int i = 0; i < entries.length; i += 2) {
map.put((K) entries[i], (V) entries[i + 1]);
}
return map;
}
調(diào)用:
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> map = mapOf(
"companyName", "科技有限公司",
"loginUrl", "https://www.baidu.com/",
"bcc", "https://www.baidu.com/"
);
list.add(map);
- 優(yōu)點(diǎn):通用性強(qiáng),可在不同場景復(fù)用。
- 限制:需要額外的工具類支持。
根據(jù)場景選擇合適的寫法,如果所有內(nèi)容都是常量且不可變,推薦 Map.of() 或 Map.ofEntries() 的寫法。
附:java多層map初始化
因?yàn)榫酆闲枨?,一開始構(gòu)造了一個(gè)四層map,由于放入實(shí)例前需要先判斷前面的map存不存在,如果不存在則要new新的map,并把數(shù)據(jù)放進(jìn)去,一開始直接if else寫寫了兩百多行。
cr之后覺得很丑陋,就尋找簡單的方法去重寫。首先將map結(jié)構(gòu)重新規(guī)劃,將一些固定的值從map中去除,將中間兩層的鍵用連接符合并,在輸出時(shí)再做拆分,這樣四層的map就簡化成了兩層。
針對(duì)實(shí)例化的問題,使用如下代碼:
Map<String, Map<String, Long>> tmpMap = new HashMap<>();
tmpMap.computeIfAbsent(key, k -> new HashMap<String, Long>{{
put("test", 0L);
}}) // 沒有該鍵時(shí)構(gòu)建新的map,省去if-else的contains判斷
tmpMap.get(key).computeIfPresent("test", (String key, String value) -> ++value); // 如果內(nèi)層map有該鍵,則值加1,省去先get再put步驟。
在用computeIfPresent()方法的時(shí)候犯了個(gè)錯(cuò)誤,一開始寫value++,由于lambda表達(dá)式相當(dāng)于匿名內(nèi)部類,value++會(huì)在該行執(zhí)行以后再增加值,而該行執(zhí)行后已經(jīng)退出了lambda范圍因而值沒變,而++value或者value + 1則能賦值,因而出于保險(xiǎn)起見,在編碼中應(yīng)該盡量使用value += 1類似寫法。
總結(jié)
到此這篇關(guān)于Java Map初始化并賦值的幾種簡短寫法的文章就介紹到這了,更多相關(guān)Java Map初始化賦值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot利用Docker快速部署項(xiàng)目的完整步驟
這篇文章主要給大家介紹了關(guān)于Spring Boot利用Docker快速部署項(xiàng)目的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
java商城項(xiàng)目實(shí)戰(zhàn)之購物車功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了java商城項(xiàng)目實(shí)戰(zhàn)之購物車功能實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
java多線程返回值使用示例(callable與futuretask)
這篇文章主要介紹了多線程返回值使用示例(callable與futuretask),需要的朋友可以參考下2014-04-04
spring?boot中spring框架的版本升級(jí)圖文教程
Spring Boot是一款基于Spring框架的快速開發(fā)框架,它提供了一系列的開箱即用的功能和組件,這篇文章主要給大家介紹了關(guān)于spring?boot中spring框架的版本升級(jí)的相關(guān)資料,需要的朋友可以參考下2023-10-10
Java Redis分布式鎖的正確實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Java Redis分布式鎖的正確實(shí)現(xiàn)方式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
關(guān)于cron表達(dá)式每天整點(diǎn)執(zhí)行一次的問題
這篇文章主要介紹了關(guān)于cron表達(dá)式每天整點(diǎn)執(zhí)行一次的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
基于java springboot + mybatis實(shí)現(xiàn)電影售票管理系統(tǒng)
這篇文章主要介紹了基于java springboot + mybatis實(shí)現(xiàn)的完整電影售票管理系統(tǒng)基于java springboot + mybatis,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08

