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);
	}
}

打印结果:

相关推荐
一休哥助手4 分钟前
Redis 五种数据类型及底层数据结构详解
数据结构·数据库·redis
救救孩子把5 分钟前
深入理解 Java 对象的内存布局
java
落落落sss8 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
苏宸啊11 分钟前
顺序表及其代码实现
数据结构·算法
万物皆字节13 分钟前
maven指定模块快速打包idea插件Quick Maven Package
java
lin zaixi()14 分钟前
贪心思想之——最大子段和问题
数据结构·算法
夜雨翦春韭20 分钟前
【代码随想录Day30】贪心算法Part04
java·数据结构·算法·leetcode·贪心算法
我行我素,向往自由27 分钟前
速成java记录(上)
java·速成
一直学习永不止步33 分钟前
LeetCode题练习与总结:H 指数--274
java·数据结构·算法·leetcode·数组·排序·计数排序
邵泽明33 分钟前
面试知识储备-多线程
java·面试·职场和发展