目錄
問題現象:
問題分析:
解決方法:
問題現象:
? ? ? ? 最近在項目中經常會使用到BeanUtils工具類來作對象的屬性字段拷貝,但如果應用到List集合的話就需要遍歷去操作了,如下:
????????打印結果:
????????于是打算寫個通用工具類來實現適配各種數據類型的List集合對象屬性拷貝的功能。
問題分析:
? ? ? ? 我們都知道實體類中,基本都需要getter和setter方法,以便對創建的對象進行取值和賦值操作;但當遇到一個對象含有多個屬性時,如果使用每個屬性對應的set方法來賦值,就顯得代碼很冗長,也比較浪費時間。
? ? ? ? 所以為了解決這個問題,很多時候我們都會用到Spring自帶的工具類BeanUtils。該工具類有個很強大的方法就可以用于拷貝對象屬性值到另一個對象中去,而且這兩個對象不需要數據類型相同,只要兩個對象存在相同屬性/字段名即可實現拷貝,非常方便;
? ? ? ? 測試代碼如下:
????????Student實體類:
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;}@Overridepublic String toString() {return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';}
}
???????Man實體類:
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;}@Overridepublic String toString() {return "Man{" + "name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}';}
}
? ? ? ? CopyTest測試類:
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集合的話,則必須遍歷了,如下:
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集合對象間元素屬性進行拷貝的時候,就必須針對數據類型寫上這些固定格式的代碼:
studentList.stream().forEach(item -> {Man man = new Man();BeanUtils.copyProperties(item, man);men.add(man);});
? ? ? ? 因此,我打算寫個通用的工具類來代替這些代碼,這樣使用起來就會很方便了!
解決方法:
????????CopyListUtil工具類如下:
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;}
}
? ? ? ? 測試類如下:
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);}
}
? ? ? ? 打印結果: