目录

一步到位springboot目录
gitee:https://gitee.com/chaitou/leilema.git

前言

BeanUtils.copyProperties();确实为我们做了很多事情,虽然不能完美完成深拷贝,但是对于povodto的拷贝已经足够用了。但是其还是有一些不够完美的地方

不足:

  1. 不能拷贝list,而拷贝list的情况又大量存在,因此会有许多重复代码
     for (S source : sources) {T target = new T();copyProperties(source, target);list.add(target);}
  1. 有一些简单的查询,仅仅需要转换一下vo也需要new Vo()
public Vo findById(Integer id) {Vo vo = new Vo();Po po = dao.findById(id);copyProperties(po, vo);return vo;
}
  1. 这种拷贝方式是没有返回值的,现在jdk8支持stream()操作之后(参考:Jdk8 Stream),支持不是很友好,不方便lambda表达式的使用

因此我们决定通过集成BeanUtils类,自己造一个方便用的轮子。

使用

我们将新创建一个轮子BeanConvertUtils,使用如下

  1. 当我们要转换povo时,只需要
// 使用前
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)));
}
  1. 当我们要拷贝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工具类感觉怎么样,自己在项目中倒是大量使用,也很方便。但是有两点要提醒

  1. 此方法依旧不能解决深层次的深拷贝问题,详细的可以google一下BeanUtils的深拷贝问题
  2. 如果source或者targetSupplier只要有一个为null,本工具类不像BeanUtils一样抛出异常,而是返回null,因为笔者认为调用方如果把null进行准换,那就是想转换为null,为不为空应该由调用方自己负责

BeanUtils如何优雅的拷贝List相关推荐

  1. beanutils copyproperties_你还在用BeanUtils进行对象属性拷贝?

    作者:Van_Fan 在做业务的时候,为了隔离变化,我们会将DAO查询出来的DO和对前端提供的DTO隔离开来.大概90%的时候,它们的结构都是类似的:但是我们很不喜欢写很多冗长的b.setF1(a.g ...

  2. 优雅的拷贝公式到word中

    有时在写文章或者搞别的东西的时候需要用到别人的公式,然而一般这些公式都是复制不了的,如果这个时候一个个去打可以说相当要命.然而我们可以通过:mathpix这个神器轻轻松松解决这个问题.有了它之后,在哪 ...

  3. 对象拷贝 Apache BeanUtils与Spring BeanUtils性能比较

    前言 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进 ...

  4. Java工具方法——属性拷贝方法:BeanUtils.copyProperties(Object, Object)

    介绍 org.springframework.beans.BeanUtils.copyProperties(Object, Object)是spring 框架的对象工具类:BeanUtils下的一个拷 ...

  5. Bean的拷贝之BeanUtils

    本文来说下Bean的各类拷贝工具 文章目录 概述 对象拷贝 BeanUtils apache的BeanUtils spring的BeanUtils cglib BeanCopier Hutool Be ...

  6. BeanUtils的拷贝

    浅谈BeanUtils的拷贝,深度克隆 1.BeanUtil本地简单测试 在项目中由于需要对某些对象进行深度拷贝然后进行持久化操作,想到了apache和spring都提供了BeanUtils的深度拷贝 ...

  7. BeanUtils 是用 Spring 的还是 Apache 的好?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | urlify.cn/vUfIry 前言 在我们实际项目开 ...

  8. 怎么优雅的处理Java异常?

    作者:叶知泉 来自:my.oschina.net/c5ms/blog/1827907 0 本文介绍 本文仅按照业务系统开发角度描述异常的一些处理看法.不涉及java的异常基础知识,可以自行查阅 < ...

  9. 优雅处理你的Java异常

    作者:叶知泉 来源:https://my.oschina.net/c5ms/blog/1827907 本文介绍 本文仅按照业务系统开发角度描述异常的一些处理看法,不涉及java的异常基础知识,可以自行 ...

  10. 两难!到底用 Spring BeanUtils 还是 Apache BeanUtils?

    前言 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进 ...

最新文章

  1. Angular目录结构分析以及app.module.ts详解
  2. 如何使用sdkmanager命令行接受SDK package的license
  3. React-引领未来的用户界面开发框架-读书笔记(四)
  4. 用MATLAB三步完成机器人搭建
  5. android下raw目录的作用,Android 之 assets目录和raw目录
  6. 简单的Session案例 —— 一次性验证码
  7. 【音频处理】如何“认识”一个滤波器?
  8. hadoop 2.4 namenode ha 源码分析(HealthMonitor)
  9. 【图像隐写】基于matlab GUI DWT+SVD数字水印【含Matlab源码 606期】
  10. C# mysql导入文件报错:The used command is not allowed with this MySQL version
  11. 通过ADB命令打开MTK和展讯日志的方法
  12. south的使用总结
  13. 3dmax:3dmax的三维动画之3Dmax导入BIP动作的简介之详细攻略
  14. 2017系统架构设计师的通过人数与通过率探秘
  15. SQL ITE 应用单元测试  未能加载文件或程序集
  16. 查找WebSphere Application Server 管理控制台端口号
  17. 焦虑症和植物神经紊乱是同一种疾病吗
  18. 数据预处理:自定义PDF格式批量转换TXT系统
  19. Dubbox框架简介
  20. 文献解读 | m6A——程序性细胞死亡与癌症的“双刃剑”

热门文章

  1. npm下载axios
  2. Linux面试题,经典Linux面试题,常见Linux面试题带答案
  3. 用firework中合并图标的方法
  4. matlab里直线拟合,matlab如何拟合直线
  5. WebRAY创业启示录:从小公司到隐形的巨人
  6. PostgreSQL安装及关联ArcMap,创建地理空间数据库
  7. 2656 阿克曼函数
  8. 开源办公套件LibreOffice
  9. Python - OpenCV 图像二值化处理
  10. GB35114---基于openssl加密库进行开发(一)