码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • List<Object>集合对象属性拷贝工具类


    目录

    问题现象:

    问题分析:

    解决方法:


    问题现象:

            最近在项目中经常会使用到BeanUtils工具类来作对象的属性字段拷贝,但如果应用到List集合的话就需要遍历去操作了,如下:

            打印结果:

            于是打算写个通用工具类来实现适配各种数据类型的List集合对象属性拷贝的功能。


    问题分析:

            我们都知道实体类中,基本都需要getter和setter方法,以便对创建的对象进行取值和赋值操作;但当遇到一个对象含有多个属性时,如果使用每个属性对应的set方法来赋值,就显得代码很冗长,也比较浪费时间。

            所以为了解决这个问题,很多时候我们都会用到Spring自带的工具类BeanUtils。该工具类有个很强大的方法就可以用于拷贝对象属性值到另一个对象中去,而且这两个对象不需要数据类型相同,只要两个对象存在相同属性/字段名即可实现拷贝,非常方便;

            测试代码如下:

            Student实体类:

    1. public class Student {
    2. private String name;
    3. private Integer age;
    4. public Student() {
    5. }
    6. public Student(String name, Integer age) {
    7. this.name = name;
    8. this.age = age;
    9. }
    10. public String getName() {
    11. return name;
    12. }
    13. public void setName(String name) {
    14. this.name = name;
    15. }
    16. public Integer getAge() {
    17. return age;
    18. }
    19. public void setAge(Integer age) {
    20. this.age = age;
    21. }
    22. @Override
    23. public String toString() {
    24. return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
    25. }
    26. }

           Man实体类:

    1. public class Man {
    2. private String name;
    3. private Integer age;
    4. private String sex = "男";
    5. public Man() {
    6. }
    7. public Man(String name, Integer age) {
    8. this.name = name;
    9. this.age = age;
    10. }
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public Integer getAge() {
    18. return age;
    19. }
    20. public void setAge(Integer age) {
    21. this.age = age;
    22. }
    23. public String getSex() {
    24. return sex;
    25. }
    26. public void setSex(String sex) {
    27. this.sex = sex;
    28. }
    29. @Override
    30. public String toString() {
    31. return "Man{" + "name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}';
    32. }
    33. }

            CopyTest测试类:

    1. import xxx.Man;//导入Man实体类
    2. import xxx.Student;//导入Student实体类
    3. import org.springframework.beans.BeanUtils;
    4. /**
    5. * 测试对象属性拷贝
    6. */
    7. public class CopyTest {
    8. public static void main(String[] args) {
    9. Student student = new Student("张三", 18);
    10. Man man = new Man();
    11. System.out.println(man);
    12. BeanUtils.copyProperties(student, man);
    13. System.out.println(man);
    14. }
    15. }

            打印结果:

            上面的很顺利地拷贝了Student对象的name和age属性值到Man对象中去了;但是如果是List集合的话,则必须遍历了,如下:

    1. import xxx.Man;//导入Man实体类
    2. import xxx.Student;//导入Student实体类
    3. import org.springframework.beans.BeanUtils;
    4. import java.util.ArrayList;
    5. import java.util.Arrays;
    6. import java.util.List;
    7. /**
    8. * 测试List集合对象属性拷贝
    9. */
    10. public class CopyTest {
    11. public static void main(String[] args) {
    12. // Student student = new Student("张三", 18);
    13. //
    14. // Man man = new Man();
    15. // System.out.println(man);
    16. //
    17. // BeanUtils.copyProperties(student, man);
    18. // System.out.println(man);
    19. List studentList = Arrays.asList(new Student("张三", 18), new Student("钱二", 17), new Student("赵一", 16));
    20. // 方法1:遍历
    21. ArrayList men = new ArrayList<>();
    22. studentList.stream().forEach(item -> {
    23. Man man = new Man();
    24. BeanUtils.copyProperties(item, man);
    25. men.add(man);
    26. });
    27. System.out.println(men);
    28. }
    29. }
    30.         打印结果:

              可以看到也很顺利的实现了List集合对象间元素属性拷贝的功能。

              但是遍历的方法并不通用,无法适配所有数据类型,也就是说每当遇到这种需要对List集合对象间元素属性进行拷贝的时候,就必须针对数据类型写上这些固定格式的代码:

      1. studentList.stream().forEach(item -> {
      2. Man man = new Man();
      3. BeanUtils.copyProperties(item, man);
      4. men.add(man);
      5. });

              因此,我打算写个通用的工具类来代替这些代码,这样使用起来就会很方便了!


      解决方法:

              CopyListUtil工具类如下:

      1. import org.springframework.beans.BeanUtils;
      2. import org.springframework.util.CollectionUtils;
      3. import java.util.ArrayList;
      4. import java.util.List;
      5. import java.util.function.Supplier;
      6. /**
      7. * List集合对象属性拷贝工具类
      8. * @author : Stephen
      9. * @version : 1.0
      10. * @date : 2024/2/29
      11. */
      12. public class CopyListUtil extends BeanUtils {
      13. /**
      14. * List集合对象属性拷贝
      15. *
      16. * @param sources
      17. * @param target
      18. * @param
      19. * @param
      20. * @return
      21. */
      22. public static List copyListProperties(List sources, Supplier target) {
      23. if ( CollectionUtils.isEmpty(sources)){
      24. return new ArrayList();
      25. }
      26. List list = new ArrayList<>(sources.size());
      27. for (S source : sources) {
      28. T t = target.get();
      29. copyProperties(source, t);
      30. list.add(t);
      31. }
      32. return list;
      33. }
      34. }
      35.         测试类如下:

        1. import xxx.Man;//导入Man实体类
        2. import xxx.Student;//导入Student实体类
        3. import com.stephen.util.CopyListUtil;//导入CopyListUtil工具类
        4. import org.springframework.beans.BeanUtils;
        5. import java.util.ArrayList;
        6. import java.util.Arrays;
        7. import java.util.List;
        8. /**
        9. * 测试List集合对象属性拷贝
        10. */
        11. public class CopyTest {
        12. public static void main(String[] args) {
        13. // Student student = new Student("张三", 18);
        14. //
        15. // Man man = new Man();
        16. // System.out.println(man);
        17. //
        18. // BeanUtils.copyProperties(student, man);
        19. // System.out.println(man);
        20. List studentList = Arrays.asList(new Student("张三", 18), new Student("钱二", 17), new Student("赵一", 16));
        21. // 方法1:遍历
        22. // ArrayList men = new ArrayList<>();
        23. // studentList.stream().forEach(item -> {
        24. // Man man = new Man();
        25. // BeanUtils.copyProperties(item, man);
        26. // men.add(man);
        27. // });
        28. // System.out.println(men);
        29. // 方法2:使用工具类进行遍历:
        30. List men2 = CopyListUtil.copyListProperties(studentList, Man::new);
        31. System.out.println(men2);
        32. }
        33. }
        34.         打印结果:

        35. 相关阅读:
          1034. 边界着色-深度优先遍历
          Python之selenium库基础
          把 Maven 提交到项目?Maven Wrapper的使用与好处
          用QT实现一个简单的桌面宠物
          Vue基础入门
          基于Java+SpringBoot+Vue+小程序实现前后端分离二手交易系统
          【计算机视觉】SimSiam 讲解
          最新AI系统ChatGPT网站H5系统源码,支持Midjourney绘画
          代码圈复杂度治理小结
          【访问控制】—>《熟练使用ACL进行上网行为管理》
        36. 原文地址:https://blog.csdn.net/weixin_42585386/article/details/136377814
          • 最新文章
          • 攻防演习之三天拿下官网站群
            数据安全治理学习——前期安全规划和安全管理体系建设
            企业安全 | 企业内一次钓鱼演练准备过程
            内网渗透测试 | Kerberos协议及其部分攻击手法
            0day的产生 | 不懂代码的"代码审计"
            安装scrcpy-client模块av模块异常,环境问题解决方案
            leetcode hot100【LeetCode 279. 完全平方数】java实现
            OpenWrt下安装Mosquitto
            AnatoMask论文汇总
            【AI日记】24.11.01 LangChain、openai api和github copilot
          • 热门文章
          • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
            奉劝各位学弟学妹们,该打造你的技术影响力了!
            五年了,我在 CSDN 的两个一百万。
            Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
            面试官都震惊,你这网络基础可以啊!
            你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
            心情不好的时候,用 Python 画棵樱花树送给自己吧
            通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
            13 万字 C 语言从入门到精通保姆级教程2021 年版
            10行代码集2000张美女图,Python爬虫120例,再上征途
          Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
          正则表达式工具 cron表达式工具 密码生成工具

          京公网安备 11010502049817号