BeanToMapUtil-对象转Map

一、工具类整体说明

该工具类封装了 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
    }
}

五、关键注意事项

  1. Bean 字段要求:转换的 Bean 需符合 JavaBean 规范(字段私有,提供 getter 方法),否则 BeanMap 无法获取字段值;
  2. 空值处理差异
    • 方法 1:null 字段值 → 空字符串;
    • 方法 2/3:null 字段值 → 直接丢弃(不加入 Map);
  3. 性能提示:BeanMap 转换性能略低于手动遍历,高频调用场景可考虑缓存转换逻辑。

六、方法对比表

方法名 键值类型 空值处理 特殊能力 适用场景
objToStringMapWithDefault Map<String, String> null 值→空字符串 - 需要统一空值格式的场景
objToStringMap Map<String, String> 丢弃 null 值 忽略指定字段 需要过滤字段的字符串值转换
objTogMap Map<String, Object> 丢弃 null 值 保留原始值类型 需要保留字段原始类型的场景

总结

  1. 三个方法核心都是将 Java Bean 转为 Map,核心差异在于值类型空值处理字段过滤
  2. 方法 1 适合需要统一空值格式的场景,方法 2 适合需要过滤字段的字符串转换,方法 3 适合保留值原始类型的场景;
  3. 使用前需引入 Guava、Commons BeanUtils、Commons Lang3 三个依赖,且 Bean 需符合 JavaBean 规范。

实际使用场景:

在redis中,需要把一个对象以hash形式保存时,可以用这个工具类。

相关推荐
code_std2 小时前
保存文件到指定位置,读取/删除指定文件夹中文件
java·spring boot·后端
小许学java2 小时前
Spring事务和事务传播机制
java·数据库·spring·事务
大学生资源网2 小时前
基于Javaweb技术的宠物用品商城的设计与实现(源码+文档)
java·mysql·毕业设计·源码·springboot
汤姆yu2 小时前
基于springboot的热门文创内容推荐分享系统
java·spring boot·后端
星光一影2 小时前
教育培训机构消课管理系统智慧校园艺术舞蹈美术艺术培训班扣课时教务管理系统
java·spring boot·mysql·vue·mybatis·uniapp
lkbhua莱克瓦242 小时前
MySQL介绍
java·开发语言·数据库·笔记·mysql
武昌库里写JAVA2 小时前
在iview中使用upload组件上传文件之前先做其他的处理
java·vue.js·spring boot·后端·sql
董世昌412 小时前
什么是事件冒泡?如何阻止事件冒泡和浏览器默认事件?
java·前端
好度2 小时前
配置java标准环境?(详细教程)
java·开发语言