Java中对象集合转换的优雅实现【实体属性范围缩小为vo】:ListUtil.convert方法详解

1.业务场景

在开发电商系统时,我们经常需要处理订单信息的展示需求。例如:订单详情页需要显示退款信息列表,而数据库中存储的**RefundInfo** 实体类包含敏感字段,直接返回给前端存在安全风险。此时就需要将**RefundInfo** 对象集合转换为**OrderInfoDetailVO.RefundInfoItem集合**

2.传统做法

复制代码
// 传统做法(冗余代码)
List<RefundInfo> refundInfoList = refundInfoService.listByOrderId(orderId);
List<OrderInfoDetailVO.RefundInfoItem> refundInfoItemList = new ArrayList<>();
for (RefundInfo info : refundInfoList) {
    OrderInfoDetailVO.RefundInfoItem item = new OrderInfoDetailVO.RefundInfoItem();
    item.setId(info.getId());
    item.setAmount(info.getAmount());
    item.setApplyTime(info.getApplyTime());
    // ...其他10+个属性赋值
    refundInfoItemList.add(item);
}

3.通用转换方案

小数据量(<10000条)可直接使用本方法

1. ListUtil工具类实现

复制代码
import org.apache.commons.beanutils.BeanUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListUtil {
    /**
     * 对象集合转换工具方法
     * @param dataList 源对象集合
     * @param clazz 目标对象类型
     * @param <T> 泛型类型
     * @return 转换后的对象集合
     */
    public static <T> List<T> convert(List<?> dataList, Class<T> clazz) {
        if (dataList == null) {
            return null;
        }
        
        List<T> result = new ArrayList<>(dataList.size());
        Iterator<?> iterator = dataList.iterator();
        
        try {
            while (iterator.hasNext()) {
                T target = clazz.getDeclaredConstructor().newInstance();
                Object source = iterator.next();
                BeanUtils.copyProperties(target, source); // 注意参数顺序
                result.add(target);
            }
        } catch (InstantiationException | IllegalAccessException | 
                NoSuchMethodException | InvocationTargetException e) {
            throw new RuntimeException("对象转换失败", e);
        }
        
        return result;
    }
}

2. 使用示例

java 复制代码
// 1. 查询数据库实体对象
List<RefundInfo> refundInfoList = refundInfoService.listByOrderId(orderId);

// 2. 转换为VO对象集合
List<OrderInfoDetailVO.RefundInfoItem> refundInfoItemList = 
    ListUtil.convert(refundInfoList, OrderInfoDetailVO.RefundInfoItem.class);

// 3. 设置到返回对象
vo.setRefundInfoList(refundInfoItemList);
相关推荐
fly-phantomWing1 小时前
Maven的安装与配置的详细步骤
java·后端·maven·intellij-idea
2401_841495644 小时前
【数据结构】红黑树的基本操作
java·数据结构·c++·python·算法·红黑树·二叉搜索树
学编程的小鬼5 小时前
SpringBoot 自动装配原理剖析
java·spring boot·后端
@@神农6 小时前
maven的概述以及在mac安装配置
java·macos·maven
杜子不疼.6 小时前
【C++】玩转模板:进阶之路
java·开发语言·c++
夜晚中的人海6 小时前
【C++】异常介绍
android·java·c++
Le1Yu7 小时前
2025-9-28学习笔记
java·笔记·学习
C++chaofan7 小时前
项目中为AI添加对话记忆
java·数据结构·人工智能·redis·缓存·个人开发·caffeine
老华带你飞7 小时前
机电公司管理小程序|基于微信小程序的机电公司管理小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·微信小程序·小程序·机电公司管理小程序
拾忆,想起7 小时前
AMQP协议深度解析:消息队列背后的通信魔法
java·开发语言·spring boot·后端·spring cloud