BeanUtils如何优雅的拷贝List
目录
一步到位springboot目录
gitee:https://gitee.com/chaitou/leilema.git
前言
BeanUtils.copyProperties();
确实为我们做了很多事情,虽然不能完美完成深拷贝
,但是对于po
、vo
、dto
的拷贝已经足够用了。但是其还是有一些不够完美的地方
不足:
- 不能拷贝list,而拷贝list的情况又大量存在,因此会有许多重复代码
for (S source : sources) {T target = new T();copyProperties(source, target);list.add(target);}
- 有一些简单的查询,仅仅需要转换一下
vo
也需要new Vo()
public Vo findById(Integer id) {Vo vo = new Vo();Po po = dao.findById(id);copyProperties(po, vo);return vo;
}
- 这种拷贝方式是没有返回值的,现在jdk8支持
stream()
操作之后(参考:Jdk8 Stream),支持不是很友好,不方便lambda
表达式的使用
因此我们决定通过集成BeanUtils
类,自己造一个方便用的轮子。
使用
我们将新创建一个轮子BeanConvertUtils
,使用如下
- 当我们要转换
po
、vo
时,只需要
// 使用前
public Vo findById(Integer id) {Vo vo = new Vo();Po po = dao.findById(id);copyProperties(po, vo);return vo;
}// 使用后
public Vo findById(Integer id) {return BeanConvertUtils.converTo(dao.findById(id), Vo::new);
}// 使用后,通过lambda表达式特殊处理个别字段
public Vo findById(Integer id) {return BeanConvertUtils.converTo(dao.findById(id), Vo::new, (s, t) -> t.setName(s.getName)));
}
- 当我们要拷贝list的时候也很简单
// 使用前
public List<Vo> findAll() {List<Vo> vos = new ArrayList();List<Po> pos = dao.findAll();for (Po po : Pos) {Vo vo = new Vo();BeanUtis.copyProperties(po, vo);vos.add(vo);}return vos;
}// 使用后
public List<Vo> findAll() {return BeanConvertUtils.converToList(dao.findAll(), Vo::new)
}// 同样支持自定义lambda
public List<Vo> findAll() {return BeanConvertUtils.converToList(dao.findAll(), Vo::new,(s, t) -> t.setName(s.getName)))
}
代码
/*** 转换对象工具** @author bugpool*/
public class BeanConvertUtils extends BeanUtils {public static <S, T> T convertTo(S source, Supplier<T> targetSupplier) {return convertTo(source, targetSupplier, null);}/*** 转换对象** @param source 源对象* @param targetSupplier 目标对象供应方* @param callBack 回调方法* @param <S> 源对象类型* @param <T> 目标对象类型* @return 目标对象*/public static <S, T> T convertTo(S source, Supplier<T> targetSupplier, ConvertCallBack<S, T> callBack) {if (null == source || null == targetSupplier) {return null;}T target = targetSupplier.get();copyProperties(source, target);if (callBack != null) {callBack.callBack(source, target);}return target;}public static <S, T> List<T> convertListTo(List<S> sources, Supplier<T> targetSupplier) {return convertListTo(sources, targetSupplier, null);}/*** 转换对象** @param sources 源对象list* @param targetSupplier 目标对象供应方* @param callBack 回调方法* @param <S> 源对象类型* @param <T> 目标对象类型* @return 目标对象list*/public static <S, T> List<T> convertListTo(List<S> sources, Supplier<T> targetSupplier, ConvertCallBack<S, T> callBack) {if (null == sources || null == targetSupplier) {return null;}List<T> list = new ArrayList<>(sources.size());for (S source : sources) {T target = targetSupplier.get();copyProperties(source, target);if (callBack != null) {callBack.callBack(source, target);}list.add(target);}return list;}/*** 回调接口** @param <S> 源对象类型* @param <T> 目标对象类型*/@FunctionalInterfacepublic interface ConvertCallBack<S, T> {void callBack(S t, T s);}
}
性能
由于只是BeanUtils
的一个封装,跟原来的代码性能几乎差不多,如果要说差一点也没错,毕竟多了一层函数堆栈的调用,但是基本可以忽略不计。主要的性能还是由BeanUtils
决定。
提醒
不知道大家对这个BeanConvertUtils
工具类感觉怎么样,自己在项目中倒是大量使用,也很方便。但是有两点要提醒
- 此方法依旧不能解决深层次的
深拷贝
问题,详细的可以google
一下BeanUtils
的深拷贝问题 - 如果
source
或者targetSupplier
只要有一个为null
,本工具类不像BeanUtils
一样抛出异常,而是返回null
,因为笔者认为调用方如果把null
进行准换,那就是想转换为null
,为不为空应该由调用方自己负责
BeanUtils如何优雅的拷贝List相关推荐
- beanutils copyproperties_你还在用BeanUtils进行对象属性拷贝?
作者:Van_Fan 在做业务的时候,为了隔离变化,我们会将DAO查询出来的DO和对前端提供的DTO隔离开来.大概90%的时候,它们的结构都是类似的:但是我们很不喜欢写很多冗长的b.setF1(a.g ...
- 优雅的拷贝公式到word中
有时在写文章或者搞别的东西的时候需要用到别人的公式,然而一般这些公式都是复制不了的,如果这个时候一个个去打可以说相当要命.然而我们可以通过:mathpix这个神器轻轻松松解决这个问题.有了它之后,在哪 ...
- 对象拷贝 Apache BeanUtils与Spring BeanUtils性能比较
前言 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进 ...
- Java工具方法——属性拷贝方法:BeanUtils.copyProperties(Object, Object)
介绍 org.springframework.beans.BeanUtils.copyProperties(Object, Object)是spring 框架的对象工具类:BeanUtils下的一个拷 ...
- Bean的拷贝之BeanUtils
本文来说下Bean的各类拷贝工具 文章目录 概述 对象拷贝 BeanUtils apache的BeanUtils spring的BeanUtils cglib BeanCopier Hutool Be ...
- BeanUtils的拷贝
浅谈BeanUtils的拷贝,深度克隆 1.BeanUtil本地简单测试 在项目中由于需要对某些对象进行深度拷贝然后进行持久化操作,想到了apache和spring都提供了BeanUtils的深度拷贝 ...
- BeanUtils 是用 Spring 的还是 Apache 的好?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | urlify.cn/vUfIry 前言 在我们实际项目开 ...
- 怎么优雅的处理Java异常?
作者:叶知泉 来自:my.oschina.net/c5ms/blog/1827907 0 本文介绍 本文仅按照业务系统开发角度描述异常的一些处理看法.不涉及java的异常基础知识,可以自行查阅 < ...
- 优雅处理你的Java异常
作者:叶知泉 来源:https://my.oschina.net/c5ms/blog/1827907 本文介绍 本文仅按照业务系统开发角度描述异常的一些处理看法,不涉及java的异常基础知识,可以自行 ...
- 两难!到底用 Spring BeanUtils 还是 Apache BeanUtils?
前言 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进 ...
最新文章
- Angular目录结构分析以及app.module.ts详解
- 如何使用sdkmanager命令行接受SDK package的license
- React-引领未来的用户界面开发框架-读书笔记(四)
- 用MATLAB三步完成机器人搭建
- android下raw目录的作用,Android 之 assets目录和raw目录
- 简单的Session案例 —— 一次性验证码
- 【音频处理】如何“认识”一个滤波器?
- hadoop 2.4 namenode ha 源码分析(HealthMonitor)
- 【图像隐写】基于matlab GUI DWT+SVD数字水印【含Matlab源码 606期】
- C# mysql导入文件报错:The used command is not allowed with this MySQL version
- 通过ADB命令打开MTK和展讯日志的方法
- south的使用总结
- 3dmax:3dmax的三维动画之3Dmax导入BIP动作的简介之详细攻略
- 2017系统架构设计师的通过人数与通过率探秘
- SQL ITE 应用单元测试 未能加载文件或程序集
- 查找WebSphere Application Server 管理控制台端口号
- 焦虑症和植物神经紊乱是同一种疾病吗
- 数据预处理:自定义PDF格式批量转换TXT系统
- Dubbox框架简介
- 文献解读 | m6A——程序性细胞死亡与癌症的“双刃剑”