分享

改造一下 BeanUtils,优雅的实现 List 数据拷贝

 昵称10087950 2022-06-29 发布于江苏


日英文

Life always has many things to bring you down. But, what can really bring you down is your attitude.

人生中会有很多事情把我们击败,但真正打垮我们的其实是我们自己的态度。

每日掏心话

有一天你会明白,善良比聪明更难。聪明是一种天赋,而善良是一种选择。

责编:乐乐 | 来自:bugpool.blog.csdn.net/article/details/105620681

编程技术圈(ID:study_tech)第 1639 期推文

往日回顾:抖音服务器带宽有多大,才能供上亿人同时刷?

   正文   

大家好,我是小乐

前言

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

图片

  • 不足:

1.不能拷贝list,而拷贝list的情况又大量存在,因此会有许多重复代码。

for (S source : sources) {
    T target = new T();
    copyProperties(source, target);
    list.add(target);
}

2.有一些简单的查询,仅仅需要转换一下vo也需要new Vo()

public Vo findById(Integer id) {
 Vo vo = new Vo();
 Po po = dao.findById(id);
 copyProperties(po, vo);
 return vo;
}

3.这种拷贝方式是没有返回值的,现在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的时候也很简单

图片图片图片图片图片图片

牛逼啊!接私活必备的 N 个开源项目!赶快收藏吧

// 使用前
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> convertTo(S source, Supplier<T> targetSupplier) {
        return convertTo(source, targetSupplier, null);
    }

    /**
     * 转换对象,公众号:Java精选
     *
     * @param source         源对象
     * @param targetSupplier 目标对象供应方
     * @param callBack       回调方法
     * @param <S>            源对象类型
     * @param <T>            目标对象类型
     * @return 目标对象
     */

    public static <S, 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;
    }

    /**
     * 回调接口 公众号:Java精选
     *
     * @param <S> 源对象类型
     * @param <T> 目标对象类型
     */

    @FunctionalInterface
    public interface ConvertCallBack<ST{
        void callBack(S t, T s);
    }
}

性能

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多