目录
问题现象:
最近在项目中经常会使用到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);
}
}
打印结果: