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

BeanUtils拷贝List数据

工具类:

package com.ssdl.baize.pub;import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
import org.springframework.beans.BeanUtils;public class BeanConvertUtils extends BeanUtils {public static <S, T> T convertTo(S source, Supplier<T> targetSupplier) {return convertTo(source, targetSupplier, null);}/*** 转换对象* @param source         源对象* @param targetSupplier 目标对象供应方* @param callBack       回调方法* @param <S>            源对象类型* @param <T>            目标对象类型* @return 目标对象*/public static <S, T> T convertTo(S source, Supplier<T> targetSupplier, ConvertCallBack<S, T> callBack) {if (null == source || null == targetSupplier) {return null;}T target = targetSupplier.get();copyProperties(source, target);if (callBack != null) {callBack.callBack(source, target);}return target;}public static <S, T> List<T> convertListTo(List<S> sources, Supplier<T> targetSupplier) {return convertListTo(sources, targetSupplier, null);}/*** 转换对象* @param sources        源对象list* @param targetSupplier 目标对象供应方* @param callBack       回调方法* @param <S>            源对象类型* @param <T>            目标对象类型* @return 目标对象list*/public static <S, T> List<T> convertListTo(List<S> sources, Supplier<T> targetSupplier, ConvertCallBack<S, T> callBack) {if (null == sources || null == targetSupplier) {return null;}List<T> list = new ArrayList<>(sources.size());for (S source : sources) {T target = targetSupplier.get();copyProperties(source, target);if (callBack != null) {callBack.callBack(source, target);}list.add(target);}return list;}/*** 回调接口** @param <S> 源对象类型* @param <T> 目标对象类型*/@FunctionalInterfacepublic interface ConvertCallBack<S, T> {void callBack(S t, T s);}/*** 将源列表中的数据复制到目标列表中,并返回目标列表。** @param sourceList 源列表* @param targetClass 目标列表中元素的类* @return 目标列表*/public static <S, T> List<T> copyList(List<S> sourceList, Class<T> targetClass) {List<T> targetList = new ArrayList<>();for (S source : sourceList) {T target;try {target = targetClass.getDeclaredConstructor().newInstance();BeanUtils.copyProperties(target, source);targetList.add(target);} catch (InstantiationException | IllegalAccessException | InvocationTargetException| NoSuchMethodException e) {// 处理异常e.printStackTrace();}}return targetList;}
}

方法测试:

package com.ssdl.baize.pub;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Test;import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;public class Test01 {public static void main(String[] args) {}@Testpublic  void test01(){// 创建源对象列表List<SourceEntity> sourceList = new ArrayList<>();sourceList.add(new SourceEntity(1L, "张三"));sourceList.add(new SourceEntity(2L, "李四"));sourceList.add(new SourceEntity(3L, "王五"));// 定义目标对象的供应方(Supplier)Supplier<TargetDTO> targetSupplier = TargetDTO::new;// 转换对象列表List<TargetDTO> targetList = BeanConvertUtils.convertListTo(sourceList, targetSupplier, (source, target) -> {// 可以在回调函数中进行额外的处理   比如特定字段的赋值等target.setId(source.getId());});// 输出转换后的目标对象列表for (TargetDTO dto : targetList) {System.out.println("ID: " + dto.getId() + ", Name: " + dto.getName());}}@Testpublic  void test02(){// 单个对象SourceEntity zhangSan = new SourceEntity(1L, "张三");TargetDTO targetDTO = BeanConvertUtils.convertTo(zhangSan, TargetDTO::new);System.out.println("单个对象:"+targetDTO);// 单个对象某字段特殊处理TargetDTO targetDTO1 = BeanConvertUtils.convertTo(zhangSan, TargetDTO::new, (a, b) -> {Long id = a.getId();if (1L==id){b.setId(2L);}});System.out.println("单个对象某字段特殊处理:"+targetDTO1);}@Data@AllArgsConstructor@NoArgsConstructorstatic class SourceEntity {private Long id;private String name;}@Data@AllArgsConstructor@NoArgsConstructorstatic class TargetDTO {private Long id;private String name;}
}

结果:
在这里插入图片描述

相关文章:

  • 无忧易售功能:刊登页面文本翻译,无缝对接全球买家
  • DDR自学笔记
  • 前端利用vue如何实现导入和导出功能.md
  • springboot @configuration注解的配置, @bean注解方法a, 在@bean注解 getb(){}需要注入a
  • llm学习-3(向量数据库的使用)
  • 04-《黄蜀葵》
  • 软考的报名详细流程
  • 详解flink sql, calcite logical转flink logical
  • vue 组件el-tree添加结构指示线条
  • Leetcode 538:把二叉搜索树转化为累加树
  • C++ QT 全局信号的实现
  • 【爱上C++】详解string类2:模拟实现、深浅拷贝
  • Java [ 基础 ] HashMap详解 ✨
  • Python中的双向哈希表(双向字典)
  • Qt 使用 QZipReader 解压文件
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • echarts花样作死的坑
  • Java程序员幽默爆笑锦集
  • java概述
  • Mybatis初体验
  • python_bomb----数据类型总结
  • Python连接Oracle
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 开源SQL-on-Hadoop系统一览
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 实习面试笔记
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 由插件封装引出的一丢丢思考
  • 智能网联汽车信息安全
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • (007)XHTML文档之标题——h1~h6
  • (55)MOS管专题--->(10)MOS管的封装
  • (zhuan) 一些RL的文献(及笔记)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (分布式缓存)Redis分片集群
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (七)Java对象在Hibernate持久化层的状态
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (五)IO流之ByteArrayInput/OutputStream
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)基于IDEA的JAVA基础12
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .net 托管代码与非托管代码
  • .net中调用windows performance记录性能信息
  • @KafkaListener注解详解(一)| 常用参数详解
  • @media screen 针对不同移动设备
  • @ModelAttribute注解使用
  • @ResponseBody
  • @SuppressLint(NewApi)和@TargetApi()的区别