当前位置: 首页 > news >正文

List<Object>集合对象属性拷贝工具类

目录

问题现象:

问题分析:

解决方法:


问题现象:

        最近在项目中经常会使用到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);}
}

        打印结果:

相关文章:

List<Object>集合对象属性拷贝工具类

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 问题现象&#xff1a; 最近在项目中经常会使用到BeanUtils工具类来作对象的属性字段拷贝&#xff0c;但如果应用到List集合的话就需要遍历去操作了&#xff0c;如下&#xff1a; 打印结果&#xff1a; …...

请说明Vue中的异步组件加载

Vue中的异步组件加载是指当页面需要渲染某个组件时&#xff0c;可以在需要时再去加载这个组件&#xff0c;而不是在页面初始化的时候就将所有组件一次性加载进来。这种方式能够有效降低页面的初始加载时间&#xff0c;提升用户体验。 在Vue中&#xff0c;我们可以使用import函…...

目标检测5:采用yolov8, RK3568上推理实时视频流

上一个效果图&#xff0c;海康球机对着电脑屏幕拍&#xff0c;清晰度不好。 RK3568接取RTSP视频流&#xff0c;通过解码&#xff0c;推理&#xff0c;编码&#xff0c;最终并把结果推出RTSP视频流。 数据集采用coco的80个种类集&#xff0c;通过从yovo8.pt&#xff0c;转换成R…...

微服务:Feign篇

1.什么是Feign Feign是一种声明式、模板化的HTTP客户端&#xff0c;可用于调用HTTP API实现微服务之间的远程服务调用。它的特点是使用少量的配置定义服务客户端接口&#xff0c;可以实现简单和可重用的RPC调用。 先来看我们以前利用RestTemplate发起远程调用的代码&#xff…...

基于chatgpt的聊天机器人

基于chatgpt的聊天机器人 以下是一个基于Python的示例代码&#xff0c;展示如何在本地环境中使用预训练的ChatGPT模型构建一个简单的聊天机器人应用程序。在这个示例中&#xff0c;我们将使用Hugging Face Transformers库加载GPT-2模型&#xff0c;并创建一个基于命令行的用户…...

BAT常见的20道Android面试题详解,我的头条面试经历分享

二、面试 下面主要列举下在面试过程中遇到过的剑指 offer 原题或者类似问题&#xff0c;大家应该清楚&#xff0c;面试过程中遇到原题不要太高兴&#xff0c;而刷剑指 offer 就能让遇到原题的可能性大大增加。 1.字节跳动春招 面试题 68 - II. 二叉树的最近公共祖先 2.京东…...

python66-Python的循环之常用工具函数

使用zip()函数可以把两个列表“压缩”成一个zip对象(可迭代对象),这样就可以使用一个循环并行遍历两个列表。为了测试 zip()函数的功能,我们可以先在交互式解释器中“试验”一下该函数的功能。 # !/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2024/01# @Author : …...

Cocos Creator 3.8.x 制作模糊效果(比如游戏弹窗需要的模糊效果)

接着上一个讨论的话题,关于3.8.x的后效,今天来分享自定义后效来制作模糊效果,并将他应用到弹窗中做背景,话不多说开整。 一:最终效果 首先咱们来看官网自定义后效怎么搞的,从它的实例开始:自定义后效 二:定义PostProcessSettings给节点提供资源(通过编辑器修改参数的…...

MATLAB报错:尝试将 SCRIPT imread 作为函数执行

报错&#xff1a; 在执行matlab脚本的时候出现报错。 >> imread 尝试将 SCRIPT imread 作为函数执行: S:\temp_file\matlab\DigitalImageProcessing\imread.m出错 imread (line 2) I imread(S:\temp_file\matlab\DigitalImageProcessing\blueman.png);分析以及解决方…...

能源管理师:薪资待遇、技能知识与职业发展路景全解析

能源管理师作为一种新兴职业&#xff0c;近年来受到了越来越多的关注。他们在能源领域发挥着重要的作用&#xff0c;帮助企业和组织优化能源使用、降低成本并实现可持续发展。本文将详细介绍能源管理师的薪资待遇、所需具备的技能知识以及职业发展路景。 一、薪资待遇 能源管…...

opencart3 添加速卖通商品脚本

非爬虫&#xff0c;只能把速卖通商品信息拿下来解析插入到自己的项目里。 刚接触opencart3没多久&#xff0c;有一些新项目需要添加商品&#xff0c;每次手动从速卖通复制信息又很慢&#xff0c;就自己写了一个脚本。 思路&#xff1a;速卖通商品详情页有一段数据包含了几乎所…...

【Linux】USB Functionfs编程:libusb接口详解

1、USB host_app代码注释 #include <libusb.h> libusb头文件,编译时链接库:libusb-1.0#define VENDOR 0x1d6b 厂商:Linux Foundation #define PRODUCT 0x0105 设备:FunctionFS Gadge...

网络编程,IO多路复用

1.使用IO多路复用完成TCP并发服务器 #include<myhead.h> #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.124.10" //服务器IP地址int main(int argc, const char *argv[]) {//1、创建用于连接的套接字int sfd socket…...

【ue5】滑铲系统蓝图笔记

大致逻辑如下&#xff1a; 一、导入动画 滑铲蹲待机蹲行走 导入到文件夹中 可以右键设置颜色&#xff0c;便于区分。 二、调整动画 1.启动根运动 启动根运动后&#xff0c;人物才可以位移&#xff0c;不然只能在原地。 打开动画序列&#xff0c;勾选启用根运动Enabled…...

linux系统Jenkins工具参数化构建

Jenkins参数化构建 web服务器jenkins服务器编写主机清单编写脚本代码 jenkins服务web页面操作 web服务器 下载nginx 下载gitcd /usr/share/nginxrm -rf htmlgit clone http://root:Qq123456192.168.188.176/ximu/test-nginx.gitmv test-nginx/ htmljenkins服务器 下载ansible…...

生活里的英语应该【怎么说】

文章目录 一、生病的各种症状用英语怎么说&#xff1f;二、关于天气的英语怎么说&#xff1f; 一、生病的各种症状用英语怎么说&#xff1f; Im coughting! I have a sore throat. Ive lost my voice. I have a runny nose and a stuffy nose. I have shivers and a body a…...

Centos安装Jenkins

1、更新系统 &#xff08;1&#xff09;更新下系统 sudo yum -y update 安装用于下载java 17二进制文件的wget命令行工具 sudo yum -y install wget vim 2、卸载centos自带的jdk 由于我们安装的版本比较高&#xff0c;需要jdk17&#xff0c;卸载centos自带的jdk。用 下面的…...

软考中级系统集成必备100题(71-80)真题精炼

文章目录 71.简述配置管理的主要活动&#xff1f;72.配置管理和变更管理的区别&#xff1f;73.CMO的具体工作有哪些?74.配置标识的基本内容由哪些?75.配置审计包括哪些内容&#xff1f;76.配置审计的功能是什么?77.为什么要进行配置项的版本控制?78.简述配置项的版本控制流…...

visual studio的使用

文章目录 1.visual studio要加的宏命令2.清屏操作 1.visual studio要加的宏命令 #define _CRT_SECURE_NO_WARNINGS这是一个预处理器宏&#xff0c;它在 Visual Studio 中被广泛使用。其主要目的是禁用一些在 C 和 C 标准库中被认为不安全的函数的编译器警告。这些不安全的函数…...

对于爬虫的学习

本地爬取 package MyApi.a08regexdemo;import java.util.regex.Matcher; import java.util.regex.Pattern;public class RegexDemo03 {public static void main(String[] args) {//要求&#xff1a;找出里面所有javaxxString str"Java自从95年问世以来&#xff0c;经历了…...

保姆级教程:用Docker快速部署FreeSWITCH的ASR服务(含FunASR、sherpa-ncnn)

基于Docker的FreeSWITCH语音识别服务实战指南 语音识别&#xff08;ASR&#xff09;技术正在重塑通信系统的交互方式。对于FreeSWITCH开发者而言&#xff0c;将高效ASR服务集成到电话系统中&#xff0c;可以解锁语音指令控制、实时字幕生成、智能客服等创新应用场景。Docker技术…...

MRIcroGL:3步掌握开源医学影像3D可视化工具,让诊断更直观

MRIcroGL&#xff1a;3步掌握开源医学影像3D可视化工具&#xff0c;让诊断更直观 【免费下载链接】MRIcroGL v1.2 GLSL volume rendering. Able to view NIfTI, DICOM, MGH, MHD, NRRD, AFNI format images. 项目地址: https://gitcode.com/gh_mirrors/mr/MRIcroGL 想要…...

OpenClaw安全指南:gemma-3-12b-it本地化部署的权限管控策略

OpenClaw安全指南&#xff1a;gemma-3-12b-it本地化部署的权限管控策略 1. 为什么需要特别关注OpenClaw的权限管控&#xff1f; 上周我在调试一个自动化文档整理任务时&#xff0c;差点酿成大祸——OpenClaw误将我的工作目录/Documents/ProjectX识别为临时文件夹&#xff0c;…...

GPEN老照片修复案例:增强前后对比,效果直观展示

GPEN老照片修复案例&#xff1a;增强前后对比&#xff0c;效果直观展示 1. 引言&#xff1a;老照片修复的痛点与解决方案 翻开泛黄的相册&#xff0c;那些承载着珍贵记忆的老照片往往因为年代久远而变得模糊、褪色甚至破损。传统的手工修复不仅耗时耗力&#xff0c;还需要专业…...

WebPlotDigitizer:高效精准图表数据提取的智能化解决方案

WebPlotDigitizer&#xff1a;高效精准图表数据提取的智能化解决方案 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 副标题&#xff1…...

3步构建智能文献管理系统:Zotero GPT插件从配置到精通指南

3步构建智能文献管理系统&#xff1a;Zotero GPT插件从配置到精通指南 【免费下载链接】zotero-gpt GPT Meet Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-gpt 在信息爆炸的学术环境中&#xff0c;研究人员平均每天需要处理超过20篇文献&#xff0c;传…...

DRM显示框架中的“导演”:深入理解CRTC如何协同Plane与Connector工作

DRM显示框架中的“导演”&#xff1a;深入理解CRTC如何协同Plane与Connector工作 想象一下&#xff0c;当你在电影院观看一部大片时&#xff0c;银幕上的每一帧画面都经过精心编排——主角的位置、特效的时机、放映机的同步&#xff0c;所有这些元素都需要一个核心指挥者来协调…...

Omni-Vision Sanctuary 集成 MySQL 数据库:自动化图像元数据管理与检索方案

Omni-Vision Sanctuary 集成 MySQL 数据库&#xff1a;自动化图像元数据管理与检索方案 1. 场景痛点与解决方案 数字内容创作领域正面临一个普遍挑战&#xff1a;随着AI生成图像的爆发式增长&#xff0c;如何高效管理海量图片资产成为棘手问题。某电商设计团队负责人曾向我们…...

Fish Speech 1.5API文档增强:OpenAPI 3.0规范生成与Swagger UI集成

Fish Speech 1.5 API文档增强&#xff1a;OpenAPI 3.0规范生成与Swagger UI集成 1. 引言&#xff1a;为什么需要API文档增强&#xff1f; 在实际开发中&#xff0c;我们经常遇到这样的场景&#xff1a;团队新成员需要快速了解API接口&#xff0c;第三方开发者想要集成语音合成…...

SonarQube实战:通过pom.xml配置sonar-maven-plugin实现自动化代码扫描

1. 为什么需要自动化代码扫描 在软件开发过程中&#xff0c;代码质量是决定项目成败的关键因素之一。想象一下&#xff0c;你正在建造一栋房子&#xff0c;如果砖块质量不过关&#xff0c;水泥配比不对&#xff0c;即使外观再漂亮&#xff0c;也可能随时倒塌。代码也是如此&…...