目录
前言
之前写了一篇文章 java浅拷贝与深拷贝讲了如何深拷贝对象。
本文讲解如何通过第三方库来拷贝复制对象的属性值。
一、假设有Student、People类如下
public class Student {
private int id;
private String name;
private int score;
public Student() {}
public Student(int id, String name, int score) {
this.name = name;
this.id = id;
this.score = score;
}
//省略get、set方法
}
public class People {
private int id;
private String name;
private int score;
private int age;
private String address;
private String teacher;
public People() {
}
public People(int id, String name, int score, int age, String address, String teacher) {
this.id = id;
this.name = name;
this.score = score;
this.age = age;
this.address = address;
this.teacher = teacher;
}
//省略get、set方法
}
二、方式一,使用modelmapper
1.依赖
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>3.2.1</version>
</dependency>
2.工具类
import org.modelmapper.ModelMapper;
import java.util.ArrayList;
import java.util.List;
public class ConvertUtil {
private static final ModelMapper MODEL_MAPPER = new ModelMapper();
/**
* 将源对象转换为目标类型对象。
*
* @param source 源对象
* @param targetClass 目标类型的 Class 对象
* @param <S> 源对象的类型
* @param <T> 目标对象的类型
* @return 转换后的目标类型对象
*/
public static <S, T> T convert(S source, Class<T> targetClass) {
return MODEL_MAPPER.map(source, targetClass);
}
/**
* 克隆列表并将列表中的每个元素转换为目标类型。
*
* @param sourceList 源列表
* @param targetClass 目标类型的 Class 对象
* @param <S> 源列表中元素的类型
* @param <T> 目标列表中元素的类型
* @return 转换后的目标类型列表
*/
public static <S, T> List<T> cloneList(List<S> sourceList, Class<T> targetClass) {
List<T> targetList = new ArrayList<>();
for (S source : sourceList) {
T target = MODEL_MAPPER.map(source, targetClass);
targetList.add(target);
}
return targetList;
}
}
3. 测试
(1)student 与 people 的转换
Student student = new Student(1, "张三", 98);
//student转为people
People people = ConvertUtil.convert(student, People.class);
//输出
System.out.println(people.getId());
System.out.println(people.getName());
System.out.println(people.getScore());
System.out.println(people.getAddress());
System.out.println(people.getTeacher());
System.out.println("--------------------");
People people1 = new People(2, "王五", 90, 28,"北京一中","王鹏");
//people转为student
Student student1 = ConvertUtil.convert(people1, Student.class);
//输出
System.out.println(student1.getId());
System.out.println(student1.getName());
System.out.println(student1.getScore());
输出的结果:
1
张三
98
null
null
--------------------
2
王五
90
(2)List<student> 与 List<people> 的转换
Student student1 = new Student(1, "张三", 98);
Student student2 = new Student(2, "李四", 95);
List<Student> studentList1 = new ArrayList<>();
studentList1.add(student1);
studentList1.add(student2);
//List<Student> 转为 List<People>
List<People> peopleList1 = ConvertUtil.cloneList(studentList1, People.class);
//输出
peopleList1.forEach(people -> {
System.out.println(people.getId());
System.out.println(people.getName());
System.out.println(people.getScore());
System.out.println(people.getAddress());
System.out.println(people.getTeacher());
});
System.out.println("--------------------");
People people1 = new People(3, "王五", 91, 27, "北京一中", "王鹏");
People people2 = new People(3, "赵二", 92, 28, "北京二中", "李梅");
List<People> peopleList2 = new ArrayList<>();
peopleList2.add(people1);
peopleList2.add(people2);
//List<People> 转为 List<Student>
List<Student> studentList2 = ConvertUtil.cloneList(peopleList2, Student.class);
//输出
studentList2.forEach(student -> {
System.out.println(student.getId());
System.out.println(student.getName());
System.out.println(student.getScore());
});
输出的结果:
1
张三
98
null
null
2
李四
95
null
null
--------------------
3
王五
91
3
赵二
92
二、方式二,使用 Spring 的 BeanUtils
1.依赖
如果你的项目不是springboot,则需要添加如下依赖,springboot项目则不需要。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.39</version>
</dependency>
2.工具类
import org.springframework.beans.BeanUtils;
import java.util.ArrayList;
import java.util.List;
public class ConvertUtil {
/**
* 将一个对象转换为目标类型的对象
*
* @param source 源对象
* @param targetClass 目标类
* @param <T> 目标类型
* @return 转换后的目标对象
*/
public static <T> T convert(Object source, Class<T> targetClass) {
if (source == null) {
return null;
}
try {
T target = targetClass.getDeclaredConstructor().newInstance();
BeanUtils.copyProperties(source, target);
return target;
} catch (ReflectiveOperationException e) {
throw new RuntimeException("转化对象失败", e);
}
}
/**
* 克隆一个列表,并将列表中的每个元素转换为目标类型的对象
*
* @param sourceList 源列表
* @param targetClass 目标类
* @param <S> 源类型
* @param <T> 目标类型
* @return 克隆后的列表
*/
public static <S, T> List<T> cloneList(List<S> sourceList, Class<T> targetClass) {
if (sourceList == null) {
return null;
}
List<T> targetList = new ArrayList<>();
for (S source : sourceList) {
T target = convert(source, targetClass);
targetList.add(target);
}
return targetList;
}
}
3. 测试
(1)student 与 people 的转换
Student student = new Student(1, "张三", 98);
//student转为people
People people = ConvertUtil.convert(student, People.class);
//输出
System.out.println(people.getId());
System.out.println(people.getName());
System.out.println(people.getScore());
System.out.println(people.getAddress());
System.out.println(people.getTeacher());
System.out.println("--------------------");
People people1 = new People(2, "王五", 90, 28,"北京一中","王鹏");
//people转为student
Student student1 = ConvertUtil.convert(people1, Student.class);
//输出
System.out.println(student1.getId());
System.out.println(student1.getName());
System.out.println(student1.getScore());
输出的结果:
1
张三
98
null
null
--------------------
2
王五
90
(2)List<student> 与 List<people> 的转换
Student student1 = new Student(1, "张三", 98);
Student student2 = new Student(2, "李四", 95);
List<Student> studentList1 = new ArrayList<>();
studentList1.add(student1);
studentList1.add(student2);
//List<Student> 转为 List<People>
List<People> peopleList1 = ConvertUtil.cloneList(studentList1, People.class);
//输出
peopleList1.forEach(people -> {
System.out.println(people.getId());
System.out.println(people.getName());
System.out.println(people.getScore());
System.out.println(people.getAddress());
System.out.println(people.getTeacher());
});
System.out.println("--------------------");
People people1 = new People(3, "王五", 91, 27, "北京一中", "王鹏");
People people2 = new People(3, "赵二", 92, 28, "北京二中", "李梅");
List<People> peopleList2 = new ArrayList<>();
peopleList2.add(people1);
peopleList2.add(people2);
//List<People> 转为 List<Student>
List<Student> studentList2 = ConvertUtil.cloneList(peopleList2, Student.class);
//输出
studentList2.forEach(student -> {
System.out.println(student.getId());
System.out.println(student.getName());
System.out.println(student.getScore());
});
输出的结果:
1
张三
98
null
null
2
李四
95
null
null
--------------------
3
王五
91
3
赵二
92