一、工具类整体说明
该工具类封装了 3 个高频使用的 Bean 转 Map 方法,基于 Guava (谷歌工具库)和 Apache Commons BeanUtils 实现,适配不同的转换场景(空值填充、指定字段忽略、值类型保留),泛型设计支持任意 Java Bean 类型,代码健壮性高(做了空指针防护)。
二、核心依赖(需引入)
使用前需在项目中引入以下依赖:
<!-- Guava:提供 Maps/Sets 工具类 -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.3-jre</version>
</dependency>
<!-- Apache Commons BeanUtils:提供 BeanMap 工具 -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<!-- Apache Commons Lang3:提供 StringUtils 工具 -->
<dependency>
<groupId>org.apache.commons.lang3</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
三、方法详情
方法 1:objToStringMapWithDefault(空字段填充默认值)
核心功能
将 Java Bean 转为 Map<String, String>,所有 null 字段值自动填充为空字符串(避免 Map 中出现 null 值),Bean 为 null 时返回空 Map。
方法参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| bean | T | 待转换的 Java Bean 对象(泛型支持任意类型) |
返回值
Map<String, String>:key=Bean 字段名,value = 字段值(String 类型,null 字段值为 "")
完整代码
/**
* javaBean转map(空字段给默认值:空字符串)
*
* @param bean 待转换的bean对象
* @return Map<String, String> 转换后的Map,无null值
*/
public static <T> Map<String, String> objToStringMapWithDefault(T bean) {
Map<String, String> map = Maps.newHashMap();
if (Objects.nonNull(bean)) {
BeanMap beanMap = BeanMap.create(bean);
for (Object key : beanMap.keySet()) {
Object tmp = beanMap.get(key);
if (Objects.nonNull(tmp)) {
map.put(key.toString(), tmp.toString());
} else {
// null值字段填充为空字符串
map.put(key.toString(), StringUtils.EMPTY);
}
}
}
return map;
}
方法 2:objToStringMap(支持忽略指定字段)
核心功能
将 Java Bean 转为 Map<String, String>,可指定需要忽略的字段(忽略的字段不进入 Map),仅保留非 null 的字段值(null 字段直接丢弃),Bean 为 null 时返回空 Map。
方法参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| bean | T | 待转换的 Java Bean 对象 |
| ignoreProperties | String... | 可变参数,需要忽略的字段名(如 "id", "createTime") |
返回值
Map<String, String>:key=Bean 字段名(排除忽略字段),value = 字段值(String 类型,仅保留非 null 值)
完整代码
/**
* javaBean转map(支持忽略指定字段,仅保留非null值)
*
* @param bean 待转换的bean对象
* @param ignoreProperties 需要忽略的字段名(可变参数)
* @return Map<String, String> 转换后的Map(无忽略字段、无null值)
*/
public static <T> Map<String, String> objToStringMap(T bean, String... ignoreProperties) {
Map<String, String> map = Maps.newHashMap();
if (Objects.nonNull(bean)) {
// 将忽略字段转为Set,方便快速判断
Set<String> ignoreSet = Objects.isNull(ignoreProperties)
? Collections.emptySet()
: Sets.newHashSet(ignoreProperties);
BeanMap beanMap = BeanMap.create(bean);
for (Object key : beanMap.keySet()) {
String fieldName = key.toString();
// 跳过忽略的字段
if (ignoreSet.contains(fieldName)) {
continue;
}
Object tmp = beanMap.get(key);
// 仅保留非null值
if (Objects.nonNull(tmp)) {
map.put(fieldName, tmp.toString());
}
}
}
return map;
}
方法 3:objTogMap(保留值的原始类型)
核心功能
将 Java Bean 转为 Map<String, Object>,保留字段值的原始数据类型(如 Integer、Date 等不转为 String),仅保留非 null 的字段值,Bean 为 null 时返回空 Map。
方法参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| bean | T | 待转换的 Java Bean 对象 |
返回值
Map<String, Object>:key=Bean 字段名,value = 字段原始值(非 String 类型,仅保留非 null 值)
完整代码
/**
* javaBean转map(保留字段值的原始类型,仅保留非null值)
*
* @param bean 待转换的bean对象
* @return Map<String, Object> 转换后的Map(值为原始类型、无null值)
*/
public static <T> Map<String, Object> objTogMap(T bean) {
Map<String, Object> map = Maps.newHashMap();
if (Objects.nonNull(bean)) {
BeanMap beanMap = BeanMap.create(bean);
for (Object key : beanMap.keySet()) {
Object tmp = beanMap.get(key);
// 仅保留非null值,且不转换值的类型
if (Objects.nonNull(tmp)) {
map.put(key.toString(), tmp);
}
}
}
return map;
}
四、使用示例
1. 测试 Bean 定义
// 示例实体类
public class User {
private String name = "张三"; // 非null字符串
private Integer age = null; // null值
private Date createTime = new Date(); // 非null日期类型
private Long id = 1001L; // 非null长整型
// 省略 getter/setter
}
2. 方法调用示例
public class TestBeanToMap {
public static void main(String[] args) {
User user = new User();
// 方法1:空字段填充空字符串
Map<String, String> map1 = objToStringMapWithDefault(user);
System.out.println("方法1结果:" + map1);
// 输出:{name=张三, age=, createTime=Thu Dec 25 10:00:00 CST 2025, id=1001}
// 方法2:忽略age和createTime字段
Map<String, String> map2 = objToStringMap(user, "age", "createTime");
System.out.println("方法2结果:" + map2);
// 输出:{name=张三, id=1001}
// 方法3:保留值的原始类型
Map<String, Object> map3 = objTogMap(user);
System.out.println("方法3结果:" + map3);
// 输出:{name=张三, createTime=Thu Dec 25 10:00:00 CST 2025, id=1001}
System.out.println("id的类型:" + map3.get("id").getClass()); // 输出:class java.lang.Long
}
}
五、关键注意事项
- Bean 字段要求:转换的 Bean 需符合 JavaBean 规范(字段私有,提供 getter 方法),否则 BeanMap 无法获取字段值;
- 空值处理差异 :
- 方法 1:null 字段值 → 空字符串;
- 方法 2/3:null 字段值 → 直接丢弃(不加入 Map);
- 性能提示:BeanMap 转换性能略低于手动遍历,高频调用场景可考虑缓存转换逻辑。
六、方法对比表
| 方法名 | 键值类型 | 空值处理 | 特殊能力 | 适用场景 |
|---|---|---|---|---|
| objToStringMapWithDefault | Map<String, String> | null 值→空字符串 | - | 需要统一空值格式的场景 |
| objToStringMap | Map<String, String> | 丢弃 null 值 | 忽略指定字段 | 需要过滤字段的字符串值转换 |
| objTogMap | Map<String, Object> | 丢弃 null 值 | 保留原始值类型 | 需要保留字段原始类型的场景 |
总结
- 三个方法核心都是将 Java Bean 转为 Map,核心差异在于值类型 、空值处理 、字段过滤;
- 方法 1 适合需要统一空值格式的场景,方法 2 适合需要过滤字段的字符串转换,方法 3 适合保留值原始类型的场景;
- 使用前需引入 Guava、Commons BeanUtils、Commons Lang3 三个依赖,且 Bean 需符合 JavaBean 规范。
实际使用场景:
在redis中,需要把一个对象以hash形式保存时,可以用这个工具类。