List<Object>集合对象属性拷贝工具类

目录

问题现象:

问题分析:

解决方法:


问题现象:

        最近在项目中经常会使用到BeanUtils工具类来作对象的属性字段拷贝,但如果应用到List集合的话就需要遍历去操作了,如下:

        打印结果:

        于是打算写个通用工具类来实现适配各种数据类型的List集合对象属性拷贝的功能。


问题分析:

        我们都知道实体类中,基本都需要getter和setter方法,以便对创建的对象进行取值和赋值操作;但当遇到一个对象含有多个属性时,如果使用每个属性对应的set方法来赋值,就显得代码很冗长,也比较浪费时间。

        所以为了解决这个问题,很多时候我们都会用到Spring自带的工具类BeanUtils。该工具类有个很强大的方法就可以用于拷贝对象属性值到另一个对象中去,而且这两个对象不需要数据类型相同,只要两个对象存在相同属性/字段名即可实现拷贝,非常方便;

        测试代码如下:

        Student实体类:

public class Student {private String name;private Integer age;public Student() {}public Student(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';}
}

       Man实体类:

public class Man {private String name;private Integer age;private String sex = "男";public Man() {}public Man(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "Man{" + "name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}';}
}

        CopyTest测试类:

import xxx.Man;//导入Man实体类
import xxx.Student;//导入Student实体类
import org.springframework.beans.BeanUtils;/*** 测试对象属性拷贝*/
public class CopyTest {public static void main(String[] args) {Student student = new Student("张三", 18);Man man = new Man();System.out.println(man);BeanUtils.copyProperties(student, man);System.out.println(man);}
}

        打印结果:

        上面的很顺利地拷贝了Student对象的name和age属性值到Man对象中去了;但是如果是List集合的话,则必须遍历了,如下:

import xxx.Man;//导入Man实体类
import xxx.Student;//导入Student实体类
import org.springframework.beans.BeanUtils;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 测试List<Object>集合对象属性拷贝*/
public class CopyTest {public static void main(String[] args) {
//		Student student = new Student("张三", 18);
//
//		Man man = new Man();
//		System.out.println(man);
//
//		BeanUtils.copyProperties(student, man);
//		System.out.println(man);List<Student> studentList = Arrays.asList(new Student("张三", 18), new Student("钱二", 17), new Student("赵一", 16));// 方法1:遍历ArrayList<Man> men = new ArrayList<>();studentList.stream().forEach(item -> {Man man = new Man();BeanUtils.copyProperties(item, man);men.add(man);});System.out.println(men);}
}

        打印结果:

        可以看到也很顺利的实现了List集合对象间元素属性拷贝的功能。

        但是遍历的方法并不通用,无法适配所有数据类型,也就是说每当遇到这种需要对List集合对象间元素属性进行拷贝的时候,就必须针对数据类型写上这些固定格式的代码:

        studentList.stream().forEach(item -> {Man man = new Man();BeanUtils.copyProperties(item, man);men.add(man);});

        因此,我打算写个通用的工具类来代替这些代码,这样使用起来就会很方便了!


解决方法:

        CopyListUtil工具类如下:

import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;/*** List<Object>集合对象属性拷贝工具类* @author : Stephen* @version : 1.0* @date : 2024/2/29*/
public class CopyListUtil extends BeanUtils {/*** List<Object>集合对象属性拷贝** @param sources* @param target* @param <S>* @param <T>* @return*/public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target) {if ( CollectionUtils.isEmpty(sources)){return new ArrayList<T>();}List<T> list = new ArrayList<>(sources.size());for (S source : sources) {T t = target.get();copyProperties(source, t);list.add(t);}return list;}
}

        测试类如下:

import xxx.Man;//导入Man实体类
import xxx.Student;//导入Student实体类
import com.stephen.util.CopyListUtil;//导入CopyListUtil工具类
import org.springframework.beans.BeanUtils;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 测试List<Object>集合对象属性拷贝*/
public class CopyTest {public static void main(String[] args) {
//		Student student = new Student("张三", 18);
//
//		Man man = new Man();
//		System.out.println(man);
//
//		BeanUtils.copyProperties(student, man);
//		System.out.println(man);List<Student> studentList = Arrays.asList(new Student("张三", 18), new Student("钱二", 17), new Student("赵一", 16));// 方法1:遍历
//		ArrayList<Man> men = new ArrayList<>();
//		studentList.stream().forEach(item -> {
//			Man man = new Man();
//			BeanUtils.copyProperties(item, man);
//			men.add(man);
//		});
//		System.out.println(men);// 方法2:使用工具类进行遍历:List<Man> men2 = CopyListUtil.copyListProperties(studentList, Man::new);System.out.println(men2);}
}

        打印结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/503820.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

水经微图Web版1.6.0发布

让每一个人都有自己的地图&#xff01; 水经微图&#xff08;简称“微图”&#xff09;新版已上线&#xff0c;在该版本中主要新增了点线面图层分组样式设置、图层排序并按序绘制、KML支持矢量符号的存储、KML支持态势标绘要素存储和新增历史地图文本样式等。 现在&#xff0…

2024年2月最新微信域名检测拦截接口源码

这段PHP代码用于检测指定域名列表中的域名是否被封。代码首先定义了一个包含待检测域名的数组 $domainList&#xff0c;然后遍历该数组&#xff0c;对每个域名发送HTTP请求并检查响应内容以判断域名是否被封。 具体步骤如下&#xff1a; 1. 定义待检测的域名列表。 2. 遍历域名…

Python3零基础教程之字符串专题初阶

大家好&#xff0c;我是千与编程&#xff0c;上一期我们讲解了Python3编程语言中的数组与列表专题。这一期我们讲解了字符串专题初阶。 在本初阶教程中&#xff0c;我们将探索 Python3 中字符串专题的基础&#xff0c;包括字符串的输入输出、定义、连接和重复。这些概念对于理解…

langchain学习笔记(七)

RunnablePassthrough: Passing data through | &#x1f99c;️&#x1f517; Langchain 1、RunnablePassthrough可以在不改变或添加额外键的情况下传递输入。通常和RunnableParallel结合使用去分配数值给到字典的新键 两种方式调用RunnablePassthrough &#xff08;1&#…

思维题(蓝桥杯 填空题 C++)

目录 题目一&#xff1a; ​编辑 代码&#xff1a; 题目二&#xff1a; 代码&#xff1a; 题目三&#xff1a; 代码&#xff1a; 题目四&#xff1a; 代码&#xff1a; 题目五&#xff1a; 代码&#xff1a; 题目六&#xff1a; 代码七&#xff1a; 题目八&#x…

MySQL数据库下载及安装教程

MySQL数据库下载及安装教程 一、MySQL数据库下载及安装教程1.MySQL数据库下载1.1 MySQL官网1.2 MySQL官网下载页&#xff08;表面上的&#xff09;1.3 MySQL官网下载页&#xff08;真正的下载地址&#xff09;1.4 下载教程 2.MySQL数据库安装教程2.1 MySQL数据库安装版配置安装…

通过SMI(MDC/MDIO)读取外部PHY寄存器

一、基础介绍&#xff1a; SMI&#xff1a;串行管理接口&#xff08;Serial Management Interface&#xff09;&#xff0c;也被称作MII管理接口&#xff08;MII Management Interface&#xff09;&#xff0c;包括MDC和MDIO两条信号线。 MDIO是一个PHY的管理接口&#xff0c…

微信小程序云开发教程——墨刀原型工具入门(Axure导入)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

【计算机网络】TCP 如何实现可靠传输

TCP通过三次握手建立连接&#xff0c;四次挥手释放连接&#xff0c;确保连接建立和连接释放的可靠。 序列号、检验和、确认应答信号、重发机制、连接管理、窗口控制、流量控制、拥塞控制 标准回答 可靠传输就是通过TCP连接传送的数据是没有差错、不会丢失、不重复并且按序到达的…

微服务间通信重构与服务治理笔记

父工程 依赖版本管理,但实际不引入依赖 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

【Java程序员面试专栏 算法思维】六 高频面试算法题:动态规划

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊回溯算法,主要就是排列组合问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间零钱兑换动态规划+双重循环dp[i]表示兑换金额为i元的最少…

TCP为什么要三次握手?

TCP三次握手协议是为了在不可靠的互联网环境中可靠地建立起一个连接&#xff0c;三次握手可以确保两端的发送和接收能力都是正常的。 那么&#xff0c;为什么是三次而不是二次或四次握手呢&#xff1f; 为什么不是二次握手&#xff1f; 如果是二次握手&#xff0c;即客户端发…