Map.getOrDefault()是Java 8引入的便捷方法,用于替代冗余的null检查逻辑,一行代码实现“取值或设默认值”,提升可读性与安全性,适用于计数、配置回退等场景。

Map.getOrDefault() 是 Java 8 引入的便捷方法,能直接替代“先检查 key 是否存在、再取值或设默认值”的冗余判断逻辑,让代码更简洁、可读性更高、不易出错。
避免 if-else 判断 key 是否存在
传统写法常这样处理缺失 key 的情况:
Integer count = map.get("apple");
if (count == null) {
count = 0;
}
count++;
map.put("apple", count);
用 getOrDefault() 一行搞定:
int count = map.getOrDefault("apple", 0) + 1;
map.put("apple", count);
适用于计数、累加、配置回退等常见场景
以下操作天然适配 getOrDefault():
- 统计频次:如单词计数、用户行为次数,无需预先 put(0)
- 读取配置参数:获取配置项,不存在时用安全默认值(如超时设为 3000)
- 构建聚合结果:如按分类汇总金额,key 不存在时从 0 开始加
- 避免 NullPointerException:尤其在 value 类型为包装类(Integer、Boolean 等)时,省去 null 检查
注意默认值类型必须与 value 类型兼容
编译器会做类型推断,但需确保传入的默认值和 Map 声明的 value 类型一致:
Map<String, Integer> scores = new HashMap<>();
int score = scores.getOrDefault("Alice", 0); // ✅ 正确:0 是 int,自动装箱为 Integer
Map<String, List<String>> groups = new HashMap<>();
List<String> list = groups.getOrDefault("backend", new ArrayList<>()); // ✅ 正确
错误示例:
scores.getOrDefault("Alice", "N/A"); // ❌ 编译失败:String 不兼容 Integer
和 computeIfAbsent / merge 配合使用效果更佳
当逻辑涉及“获取并更新”(如初始化后追加元素),可组合使用:
- 用 computeIfAbsent() 初始化首次访问的 value(如 new ArrayList)
- 用 getOrDefault() 读取当前值做简单计算(如 +1、拼接字符串)
- 需要原子更新且逻辑复杂时,优先考虑 merge() 或 compute()
例如:统计每个订单的商品数量
map.merge("order123", 1, Integer::sum); // 更推荐:一行完成“取旧值 + 1 + 存回”
// 等价于:map.put(k, map.getOrDefault(k, 0) + 1)

















