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初始化赋值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!