当前位置: 首页 > 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;经历了…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统

核心速览 研究背景 ​​研究问题​​&#xff1a;这篇文章要解决的问题是当前大型语言模型&#xff08;LLMs&#xff09;在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色&#xff0c;但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成&#xff08;RA…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)

一、题目解析 对于递归方法的前序遍历十分简单&#xff0c;但对于一位合格的程序猿而言&#xff0c;需要掌握将递归转化为非递归的能力&#xff0c;毕竟递归调用的时候会调用大量的栈帧&#xff0c;存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧&#xff0c;而非…...