Java Map如何实现默认值_Map默认值添加方案

小婷君_3604

小婷君_3604

2025-12-26

802人浏览

原创

Java Map获取不存在key时返回默认值有四种方式:1. computeIfAbsent(推荐,延迟初始化并缓存);2. getOrDefault(简单轻量,默认值每次创建);3. 封装DefaultMap类(统一默认策略);4. 结合Guava工具(函数式懒加载)。

java map如何实现默认值_map默认值添加方案

Java 的 Map 接口本身不支持“默认值”概念,但可以通过几种常用且实用的方式,在获取不存在的 key 时自动返回默认值,避免频繁判空或重复写默认逻辑。

使用 Map.computeIfAbsent() 动态设默认值

这是最推荐的方式之一,适用于“首次访问时按需创建并缓存默认值”的场景,比如构建嵌套结构、初始化对象等。

  • 只在 key 不存在时执行 supplier,线程安全(对 ConcurrentHashMap 有效)
  • 返回的是实际存入 map 的值(即默认值),后续 get 直接命中
  • 适合默认值创建开销较大、或需延迟初始化的情况

示例:

Java Development Man
Java Development Man

Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。

下载
Map> map = new HashMap();
map.computeIfAbsent("users", k -> new ArrayList()).add("Alice");

封装工具方法:getOrDefault() 的增强版

Map.getOrDefault(key, defaultValue) 是 JDK 8+ 内置方法,简单直接,但 defaultValue 每次调用都会被创建(即使 key 存在)。

  • 适合默认值是常量、轻量对象(如空字符串、0、Collections.emptyList())
  • 若默认值构造较重(如 new Date()、new ObjectMapper()),建议改用 computeIfAbsent 或自定义 getOrCompute
  • 可封装成静态工具方法,统一管理默认策略

示例:

String name = map.getOrDefault("name", "unknown"); // 安全取值

继承或包装 Map 实现“带默认值”的语义

若项目中大量需要某类默认行为(如所有 String 值默认为 "",数字默认为 0),可封装一个 DefaultMap 类。

  • 内部持有一个 delegate Map + 默认值 Supplier
  • 重写 get() 方法:先 delegate.get,为空则调用 supplier 获取并返回(不自动 put,保持无副作用)
  • 注意:不建议直接修改原 Map 接口行为,应明确命名(如 DefaultValueMap)避免误解

示例思路:

public class DefaultValueMap implements Map {
  private final Map delegate;
  private final Supplier defaultSupplier;
  // ...
  @Override public V get(Object key) {
    V v = delegate.get(key);
    return (v != null || delegate.containsKey(key)) ? v : defaultSupplier.get();
  }
}

使用 Guava 的 Maps.newHashMapWithExpectedSize() + 自定义逻辑

Guava 提供了更丰富的 Map 工具,例如 ImmutableMap.of()、MapDifference,但它本身也不内置默认值。不过可以结合 Suppliers.memoize() 或 Function 实现懒加载默认值。

  • 适合已引入 Guava 的项目,追求函数式风格
  • 例如:用 Functions.forMap(map, () -> "default") 包装后调用 apply(key)
  • 注意:Guava 的 Function.apply 不改变原 map,纯读取语义,适合只读场景

基本上就这些。核心原则是:轻量默认值用 getOrDefault,需缓存/初始化用 computeIfAbsent,高频统一需求可封装,默认值逻辑复杂或跨模块时建议显式处理而非隐式“魔改” Map 行为。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

2024.05.29

6111

6

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7579

3

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

569

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1698

6

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6404

49

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1938

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

3204

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6404

49

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2023.11.24

6609

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习