Java Map初始化并赋值的几种简短写法

 更新时间:2025年03月31日 11:01:41   作者:一周一志程序员  
在Java中初始化一个Map并赋值可以通过多种方式完成,下面这篇文章主要介绍了Java Map初始化并赋值的几种简短写法,文中给出了详细的代码示例,需要的朋友可以参考下

需求背景:

今天需要给多用户发送邮件,但是用户信息是固定的且数量有限,索性直接写死常量池,遍历常量池进行发邮件操作。设计阶段考虑使用map进行数据封装赋值。为了使代码简洁直观,调研了几种Java Map初始化并赋值的语法。

由于我目前使用的还是java jdk1.8所以还是选择第一种内联方式创建。

对于初始化一个 Map 并直接赋值为常量的场景,可以使用以下几种简短写法:

1. 直接内联创建并添加

如果只需要一个 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/");
}});
  • 优点:减少变量声明。
  • 缺点:仍存在匿名内部类问题。

2. 使用双括号初始化 (仅推荐在测试或临时场景中使用)

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);
  • 优点:写法直观,支持可变的 Map
  • 缺点:
    • 生成的匿名内部类可能会导致内存泄漏,不推荐在生产代码中使用。

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);
  • 优点:代码简洁,不需要显式调用 put 方法。
  • 限制:
    • Map.of() 创建的 Map 是不可变的,不能再修改其内容。

4. 使用 Map.ofEntries() (Java 9+)

适用于键值对超过 10 个的场景。

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);
  • 优点:支持更多键值对初始化。
  • 限制:同样生成的 Map 是不可变的。

5. 使用工具类构造

如果初始化 Map 是常见需求,可以封装一个工具方法:

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;
}

调用:

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);
  • 优点:通用性强,可在不同场景复用。
  • 限制:需要额外的工具类支持。

根据场景选择合适的写法,如果所有内容都是常量且不可变,推荐 Map.of() 或 Map.ofEntries() 的写法。

附:java多层map初始化

因为聚合需求,一开始构造了一个四层map,由于放入实例前需要先判断前面的map存不存在,如果不存在则要new新的map,并把数据放进去,一开始直接if else写写了两百多行。

cr之后觉得很丑陋,就寻找简单的方法去重写。首先将map结构重新规划,将一些固定的值从map中去除,将中间两层的键用连接符合并,在输出时再做拆分,这样四层的map就简化成了两层。

针对实例化的问题,使用如下代码:

Map<String, Map<String, Long>> tmpMap = new HashMap<>();
tmpMap.computeIfAbsent(key, k -> new HashMap<String, Long>{{
    put("test", 0L);
}})    // 没有该键时构建新的map,省去if-else的contains判断
tmpMap.get(key).computeIfPresent("test", (String key, String value) -> ++value);    // 如果内层map有该键,则值加1,省去先get再put步骤。

在用computeIfPresent()方法的时候犯了个错误,一开始写value++,由于lambda表达式相当于匿名内部类,value++会在该行执行以后再增加值,而该行执行后已经退出了lambda范围因而值没变,而++value或者value + 1则能赋值,因而出于保险起见,在编码中应该尽量使用value += 1类似写法。

总结

到此这篇关于Java Map初始化并赋值的几种简短写法的文章就介绍到这了,更多相关Java Map初始化赋值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一篇文章带你了解MySQL数据库基础

    一篇文章带你了解MySQL数据库基础

    这篇文章主要介绍了MySql数据库基础知识点,总结整理了mysql数据库基本创建、查看、选择、删除以及数据类型相关操作技巧,需要的朋友可以参考下
    2021-08-08
  • Mybatis输入输出映射及动态SQL Review

    Mybatis输入输出映射及动态SQL Review

    这篇文章主要介绍了Mybatis输入输出映射及动态SQL Review,需要的朋友可以参考下
    2017-02-02
  • IDEA自动生成TestNG的testng.xml的插件方法

    IDEA自动生成TestNG的testng.xml的插件方法

    这篇文章主要介绍了IDEA自动生成TestNG的testng.xml的插件方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java优秀类库Hutool使用示例

    Java优秀类库Hutool使用示例

    Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,涵盖了Java开发开发中的方方面面,使用Hutool可节省开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug
    2023-02-02
  • Java8方法引用和构造引用代码实例

    Java8方法引用和构造引用代码实例

    这篇文章主要介绍了java8方法引用和构造引用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Springboot项目中定时任务的四种实现方式详解

    Springboot项目中定时任务的四种实现方式详解

    Spring的@Scheduled注解是一种非常简单和便捷的实现定时任务的方式,通过在方法上添加@Scheduled注解,我们可以指定方法在特定的时间间隔或固定的时间点执行,本文给大家介绍Springboot项目中定时任务的四种实现方式,感兴趣的的朋友一起看看b
    2024-02-02
  • Java多线程Thread类的使用及注意事项

    Java多线程Thread类的使用及注意事项

    这篇文章主要介绍了Java多线程Thread类的使用及注意事项,在java标准库中提供了一个Thread类来表示/操作线程,Thread类也可以视为是java标准库提供的API
    2022-06-06
  • Java后台如何处理日期参数格式

    Java后台如何处理日期参数格式

    这篇文章主要介绍了Java后台如何处理日期参数格式问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • SpringBoot使用Nacos进行application.yml配置管理

    SpringBoot使用Nacos进行application.yml配置管理

    Nacos是阿里巴巴开源的一个微服务配置管理和服务发现的解决方案,它提供了动态服务发现、配置管理和 服务管理平台,Nacos使用Raft协议保证配置的一致性,同时支持多种配置 格式,如properties、yaml等,本文介绍了SpringBoot使用Nacos进行application.yml配置管理
    2024-12-12
  • Java编译时类型与运行时类型

    Java编译时类型与运行时类型

    这篇文章主要介绍了Java编译时类型与运行时类型,文章以父类BaseClass和子类SubClass为例展开对主题的探讨,具有一的 参考价值,需要的小伙伴可以参考一下
    2022-03-03

最新评论