日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BeanUtils如何优雅的拷贝List

發(fā)布時(shí)間:2023/12/14 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BeanUtils如何优雅的拷贝List 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

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

前言

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

不足:

  • 不能拷貝list,而拷貝list的情況又大量存在,因此會(huì)有許多重復(fù)代碼
  • for (S source : sources) {T target = new T();copyProperties(source, target);list.add(target);}
  • 有一些簡(jiǎn)單的查詢,僅僅需要轉(zhuǎn)換一下vo也需要new Vo()
  • public Vo findById(Integer id) {Vo vo = new Vo();Po po = dao.findById(id);copyProperties(po, vo);return vo; }
  • 這種拷貝方式是沒有返回值的,現(xiàn)在jdk8支持stream()操作之后(參考:Jdk8 Stream),支持不是很友好,不方便lambda表達(dá)式的使用
  • 因此我們決定通過集成BeanUtils類,自己造一個(gè)方便用的輪子。

    使用

    我們將新創(chuàng)建一個(gè)輪子BeanConvertUtils,使用如下

  • 當(dāng)我們要轉(zhuǎn)換po、vo時(shí),只需要
  • // 使用前 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表達(dá)式特殊處理個(gè)別字段 public Vo findById(Integer id) {return BeanConvertUtils.converTo(dao.findById(id), Vo::new, (s, t) -> t.setName(s.getName))); }
  • 當(dāng)我們要拷貝list的時(shí)候也很簡(jiǎ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))) }

    代碼

    /*** 轉(zhuǎn)換對(duì)象工具** @author bugpool*/ public class BeanConvertUtils extends BeanUtils {public static <S, T> T convertTo(S source, Supplier<T> targetSupplier) {return convertTo(source, targetSupplier, null);}/*** 轉(zhuǎn)換對(duì)象** @param source 源對(duì)象* @param targetSupplier 目標(biāo)對(duì)象供應(yīng)方* @param callBack 回調(diào)方法* @param <S> 源對(duì)象類型* @param <T> 目標(biāo)對(duì)象類型* @return 目標(biāo)對(duì)象*/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)換對(duì)象** @param sources 源對(duì)象list* @param targetSupplier 目標(biāo)對(duì)象供應(yīng)方* @param callBack 回調(diào)方法* @param <S> 源對(duì)象類型* @param <T> 目標(biāo)對(duì)象類型* @return 目標(biāo)對(duì)象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> 源對(duì)象類型* @param <T> 目標(biāo)對(duì)象類型*/@FunctionalInterfacepublic interface ConvertCallBack<S, T> {void callBack(S t, T s);} }

    性能

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

    提醒

    不知道大家對(duì)這個(gè)BeanConvertUtils工具類感覺怎么樣,自己在項(xiàng)目中倒是大量使用,也很方便。但是有兩點(diǎn)要提醒

  • 此方法依舊不能解決深層次的深拷貝問題,詳細(xì)的可以google一下BeanUtils的深拷貝問題
  • 如果source或者targetSupplier只要有一個(gè)為null,本工具類不像BeanUtils一樣拋出異常,而是返回null,因?yàn)楣P者認(rèn)為調(diào)用方如果把null進(jìn)行準(zhǔn)換,那就是想轉(zhuǎn)換為null,為不為空應(yīng)該由調(diào)用方自己負(fù)責(zé)
  • 總結(jié)

    以上是生活随笔為你收集整理的BeanUtils如何优雅的拷贝List的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。