当前位置: 首页 > news >正文

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. 使用示例

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

    相关文章:

  • 数造科技携 DataBuilder 亮相安徽科交会,展现“DataOps +AI”双引擎魅力
  • 什么是智能合约?区块链上的自动化契约
  • si551x时钟芯片linux下调试总结
  • 【论文阅读】Adversarial Training Towards Robust Multimedia Recommender System
  • 物流无人机结构与载货设计分析!
  • 无人机上的热成像相机可以单独使用吗?
  • 准确--Notepad++ 实用的插件介绍
  • 定长滑动窗口---初阶篇
  • ​​大疆无人机“指点飞行模式”​​(TapFly)
  • HarmonyOS Next~HarmonyOS应用测试全流程解析:从一级类目上架到二级类目专项测试
  • HarmonyOS运动开发:如何集成百度地图SDK、运动跟随与运动公里数记录
  • 【django.db.utils.OperationalError: unable to open database file】
  • 基于Django汽车数据分析大屏可视化系统项目
  • 基于Node.js的Web爬虫: 使用Axios和Cheerio抓取网页数据
  • 1、RocketMQ 核心架构拆解
  • 蓝桥杯 20. 倍数问题
  • autojs和冰狐智能辅助该怎么选择?
  • 683SJBH基于J2EE的广州旅游管理系统
  • 【Lanqiao】数位翻转
  • 康养休闲旅游行程服务实训室:打造沉浸式康养旅游人才培养新模式
  • 姚洋将全职加盟上海财经大学,担任滴水湖高级金融学院院长
  • 当我们提起拉动消费时,应该拉动什么消费?
  • 101条关于减重的知识,其中一定有你不知道的
  • 国家出口管制工作协调机制办公室部署开展打击战略矿产走私出口专项行动
  • 习近平同瑞典国王卡尔十六世·古斯塔夫就中瑞建交75周年互致贺电
  • 马上评|比余华与史铁生的友情更动人的是什么