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

打印结果:

相关推荐
blammmp17 分钟前
Java:数据结构-枚举
java·开发语言·数据结构
暗黑起源喵35 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
昂子的博客39 分钟前
基础数据结构——队列(链表实现)
数据结构
WaaTong40 分钟前
Java反射
java·开发语言·反射
九圣残炎1 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge1 小时前
Netty篇(入门编程)
java·linux·服务器
lulu_gh_yu1 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚2 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐2 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。2 小时前
Spring Boot 配置文件
java·spring boot·后端