首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >BeanUtils如何优雅的拷贝List[通俗易懂]

BeanUtils如何优雅的拷贝List[通俗易懂]

作者头像
全栈程序员站长
发布2022-10-01 14:31:22
发布2022-10-01 14:31:22
4.2K0
举报

大家好,又见面了,我是你们的朋友全栈君。

目录

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

前言

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

不足:

  1. 不能拷贝list,而拷贝list的情况又大量存在,因此会有许多重复代码
代码语言:javascript
复制
		for (S source : sources) { 
   
            T target = new T();
            copyProperties(source, target);
            list.add(target);
        }
  1. 有一些简单的查询,仅仅需要转换一下vo也需要new Vo()
代码语言:javascript
复制
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时,只需要
代码语言:javascript
复制
// 使用前
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的时候也很简单
代码语言:javascript
复制
// 使用前
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))
)
}

代码

代码语言:javascript
复制
/** * 转换对象工具 * * @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> 目标对象类型 */
@FunctionalInterface
public interface ConvertCallBack<S, T> { 

void callBack(S t, T s);
}
}

性能

由于只是BeanUtils的一个封装,跟原来的代码性能几乎差不多,如果要说差一点也没错,毕竟多了一层函数堆栈的调用,但是基本可以忽略不计。主要的性能还是由BeanUtils决定。

提醒

不知道大家对这个BeanConvertUtils工具类感觉怎么样,自己在项目中倒是大量使用,也很方便。但是有两点要提醒

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/194813.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月12日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 前言
  • 使用
  • 代码
  • 性能
  • 提醒
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档