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

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);
    http://www.xdnf.cn/news/4289.html

    相关文章:

  • mujoco仿真器学习笔记
  • 孤岛铜怎么解决
  • CAN报文中的标准帧和扩展帧
  • C++ string的使用
  • C++输入输出
  • 基础的OSPF实验配置笔记
  • 车载诊断框架 --- 车载网关诊断通信与网关角色
  • WordPress_AdsProPlugin Sql注入漏洞复现(CVE-2024-13322)
  • Navicat访问mongo时密码转义字符问题
  • 大模型主干
  • 驱动开发系列57 - Linux Graphics QXL显卡驱动代码分析(四)显示区域更新
  • 量子教育演示系统:交互式Bloch球面与Bell态可视化技术解析
  • 【JEECG】BasicTable内嵌Table表格错位
  • 强化学习+多模态 从理论到实战
  • 黑马点评day04(分布式锁-setnx)
  • Python 脚本打包成可执行的 .exe 文件
  • 【四川省专升本计算机基础】第一章 计算机基础知识(上)
  • Redis面试 实战贴 后面持续更新链接
  • 拨叉831003加工工艺规程及夹具设计
  • 学习黑客初看肉鸡
  • 本地运行qwen3:30b-a3b速度测试
  • Python Cookbook-7.3 在 Pickling 的时候压缩
  • transformer➕lstm训练回归模型
  • 行业赋能 | 电商平台API对接,订单信息自动抓取
  • 密码工具类-生成随机密码校验密码强度是否满足要求
  • 使用阿里AI的API接口实现图片内容提取功能
  • Jackson中的ObjectNode与JsonNode详解
  • 探索Hello Robot开源移动操作机器人Stretch 3的技术亮点与市场定位
  • 快速学会Linux的WEB服务
  • 基于STM32、HAL库的NS2009 触摸屏控制器驱动程序设计