成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

改造BeanUtils,優(yōu)雅實現(xiàn)List數(shù)據(jù)拷貝

開發(fā) 前端
由于只是 BeanUtils 的一個封裝,跟原來的代碼性能幾乎差不多,如果要說差一點也沒錯,畢竟多了一層函數(shù)堆棧的調(diào)用,但是基本可以忽略不計。主要的性能還是由 BeanUtils 決定。

BeanUtils.copyProperties();確實為我們做了很多事情,雖然不能完美完成深拷貝,但是對于 po、vo、dto 的拷貝已經(jīng)足夠用了。可還是有一些不夠完美的地方。

不足幾點如下:

①. 不能拷貝 list,而拷貝 list 的情況又大量存在,因此會有許多重復(fù)代碼。

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

②. 有一些簡單的查詢,僅僅需要轉(zhuǎn)換一下 vo 也需要 new Vo()。

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

③. 這種拷貝方式是沒有返回值的,jdk8 支持 stream() 操作之后,支持不是很友好,不方便 lambda 表達式的使用,因此我們決定通過集成 BeanUtils 類,自己造一個方便用的輪子。

使用

我們將新創(chuàng)建一個輪子 BeanConvertUtils,使用如下,當(dāng)我們要轉(zhuǎn)換 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))
 );
}

當(dāng)我們要拷貝 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))
 )
}

代碼如下:

/**
 * 轉(zhuǎn)換對象工具
 *
 */
public class BeanConvertUtils extends BeanUtils {

    public static <S, T> T convertTo(S source, Supplier<T> targetSupplier) {
        return convertTo(source, targetSupplier, null);
    }

    /**
     * 轉(zhuǎn)換對象
     *
     * @param source         源對象
     * @param targetSupplier 目標對象供應(yīng)方
     * @param callBack       回調(diào)方法
     * @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);
    }

    /**
     * 轉(zhuǎn)換對象
     *
     * @param sources        源對象list
     * @param targetSupplier 目標對象供應(yīng)方
     * @param callBack       回調(diào)方法
     * @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;
    }

    /**
     * 回調(diào)接口
     *
     * @param <S> 源對象類型
     * @param <T> 目標對象類型
     */
    @FunctionalInterface
    public interface ConvertCallBack<S, T> {
        void callBack(S t, T s);
    }
}

性能

由于只是 BeanUtils 的一個封裝,跟原來的代碼性能幾乎差不多,如果要說差一點也沒錯,畢竟多了一層函數(shù)堆棧的調(diào)用,但是基本可以忽略不計。主要的性能還是由 BeanUtils 決定。

提醒

不知道大家對這個 BeanConvertUtils 工具類感覺怎么樣,自己在項目中倒是大量使用,也很方便。

但是有兩點要提醒:

  • 此方法依舊不能解決深層次的深拷貝問題,詳細的可以 google 一下 BeanUtils 的深拷貝問題。
  • 如果 source 或者 targetSupplier 只要有一個為 null,本工具類不像 BeanUtils 一樣拋出異常,而是返回 null,因為筆者認為調(diào)用方如果把 null 進行準換,那就是想轉(zhuǎn)換為 null,為不為空應(yīng)該由調(diào)用方自己負責(zé)。
責(zé)任編輯:武曉燕 來源: 一安未來
相關(guān)推薦

2021-10-14 18:15:38

BeanUtils對象生成器

2020-12-08 08:08:51

Java接口數(shù)據(jù)

2024-01-12 15:26:37

數(shù)據(jù)中心服務(wù)器ESG目標

2021-09-10 07:41:06

Python拷貝Python基礎(chǔ)

2010-05-17 11:16:07

數(shù)據(jù)中心

2010-05-31 09:44:38

2022-06-21 14:44:38

接口數(shù)據(jù)脫敏

2024-11-07 10:55:26

2024-11-08 15:56:36

2023-06-06 08:51:06

2021-10-26 10:28:41

開發(fā)架構(gòu)Kubernetes

2022-02-18 17:34:47

數(shù)組多維五維數(shù)組

2020-08-26 07:17:19

通信

2024-11-25 13:49:00

2018-08-15 10:29:58

NettyJDK內(nèi)存

2023-10-17 17:13:14

內(nèi)存程序源碼

2018-09-26 14:37:17

JavaScript前端編程語言

2011-07-22 14:18:04

iOS 文件

2013-06-13 14:15:07

數(shù)據(jù)

2025-04-17 02:00:00

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产在线视频三区 | 日本天堂一区 | 一区二区三区成人 | 又爽又黄axxx片免费观看 | www.天堂av.com| 男女av| 久久99精品久久久 | 成人aaa视频 | 亚洲午夜视频在线观看 | 男女在线网站 | 色免费看 | 男插女下体视频 | 国产一区999 | 欧美www在线 | 国产精品日日摸夜夜添夜夜av | 爱综合 | 成人免费激情视频 | 天天干免费视频 | 国产精品一区二区在线观看 | 久久久久久国产精品mv | 亚洲97 | 成人亚洲精品久久久久软件 | 国产一卡二卡三卡 | 国产精品久久久久永久免费观看 | 欧美成人猛片aaaaaaa | 一区二区国产精品 | 日韩在线观看网站 | 亚洲欧美日韩精品久久亚洲区 | 中文字幕在线观看一区 | v片网站| 日韩av在线不卡 | 久久久久久久av | 羞羞视频网站在线观看 | 日日摸夜夜添夜夜添精品视频 | 欧美日韩在线成人 | 亚洲精品综合 | 成人精品一区二区三区中文字幕 | 欧美精品久久 | 免费观看黄色一级片 | 成人国产精品免费观看 | 草草视频在线播放 |