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. 使用示例
// 1. 查询数据库实体对象
List<RefundInfo> refundInfoList = refundInfoService.listByOrderId(orderId);
// 2. 转换为VO对象集合
List<OrderInfoDetailVO.RefundInfoItem> refundInfoItemList =
ListUtil.convert(refundInfoList, OrderInfoDetailVO.RefundInfoItem.class);
// 3. 设置到返回对象
vo.setRefundInfoList(refundInfoItemList);