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

目录

问题现象:

问题分析:

解决方法:


问题现象:

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

打印结果:

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


问题分析:

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

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

测试代码如下:

Student实体类:

java 复制代码
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;
	}

	@Override
	public String toString() {
		return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
	}
}

Man实体类:

java 复制代码
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;
	}

	@Override
	public String toString() {
		return "Man{" + "name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}';
	}
}

CopyTest测试类:

java 复制代码
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集合的话,则必须遍历了,如下:

java 复制代码
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集合对象间元素属性进行拷贝的时候,就必须针对数据类型写上这些固定格式的代码:

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

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


解决方法:

CopyListUtil工具类如下:

java 复制代码
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;
    }
}

测试类如下:

java 复制代码
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);
	}
}

打印结果:

相关推荐
XiaoLeisj22 分钟前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
禁默34 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood41 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑44 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
gb42152871 小时前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶1 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
zfoo-framework1 小时前
【jenkins插件】
java
风_流沙1 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表