最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java如何拷貝復(fù)制對(duì)象和集合問(wèn)題

 更新時(shí)間:2023年09月27日 08:39:45   作者:Yang瘋狂打碼中  
這篇文章主要介紹了java如何拷貝復(fù)制對(duì)象和集合問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在Java中常見(jiàn)的對(duì)象拷貝方式是使用cglib,Cglib的性能是目前公認(rèn)最好的,用于解決Bean拷貝的性能問(wèn)題

下面是以cglib封裝的工具類(lèi)實(shí)現(xiàn)對(duì)象和集合的拷貝

一、引入依賴

<dependency>
     <groupId>cglib</groupId>
     <artifactId>cglib</artifactId>
     <version>3.3.0</version>
     <scope>compile</scope>
</dependency>

二、創(chuàng)建CglibUtil工具類(lèi)

其中包含對(duì)象和集合的拷貝,還封裝了Bean轉(zhuǎn)Map的方法

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ReflectUtil;
import net.sf.cglib.beans.BeanCopier;
import net.sf.cglib.beans.BeanMap;
import net.sf.cglib.core.Converter;
import java.util.Collection;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Supplier;
import java.util.stream.Collectors;
/**
 * @author YangBoss
 * @title: CglibUtil
 * @projectName frontop-ao
 * @description: CglibUtil工具類(lèi)
 * @date 2022/6/2 10:18
 */
public class CglibUtil {
    /**
     * 拷貝Bean對(duì)象屬性到目標(biāo)類(lèi)型<br>
     * 此方法通過(guò)指定目標(biāo)類(lèi)型自動(dòng)創(chuàng)建之,然后拷貝屬性
     *
     * @param <T>         目標(biāo)對(duì)象類(lèi)型
     * @param source      源bean對(duì)象
     * @param targetClass 目標(biāo)bean類(lèi),自動(dòng)實(shí)例化此對(duì)象
     * @return 目標(biāo)對(duì)象
     */
    public static <T> T copy(Object source, Class<T> targetClass) {
        return copy(source, targetClass, null);
    }
    /**
     * 拷貝Bean對(duì)象屬性<br>
     * 此方法通過(guò)指定目標(biāo)類(lèi)型自動(dòng)創(chuàng)建之,然后拷貝屬性
     *
     * @param <T>         目標(biāo)對(duì)象類(lèi)型
     * @param source      源bean對(duì)象
     * @param targetClass 目標(biāo)bean類(lèi),自動(dòng)實(shí)例化此對(duì)象
     * @param converter   轉(zhuǎn)換器,無(wú)需可傳{@code null}
     * @return 目標(biāo)對(duì)象
     */
    public static <T> T copy(Object source, Class<T> targetClass, Converter converter) {
        final T target = ReflectUtil.newInstanceIfPossible(targetClass);
        copy(source, target, converter);
        return target;
    }
    /**
     * 拷貝Bean對(duì)象屬性
     *
     * @param source 源bean對(duì)象
     * @param target 目標(biāo)bean對(duì)象
     */
    public static void copy(Object source, Object target) {
        copy(source, target, null);
    }
    /**
     * 拷貝Bean對(duì)象屬性
     *
     * @param source    源bean對(duì)象
     * @param target    目標(biāo)beBeanCopierCachean對(duì)象
     * @param converter 轉(zhuǎn)換器,無(wú)需可傳{@code null}
     */
    public static void copy(Object source, Object target, Converter converter) {
        Assert.notNull(source, "Source bean must be not null.");
        Assert.notNull(target, "Target bean must be not null.");
        final Class<?> sourceClass = source.getClass();
        final Class<?> targetClass = target.getClass();
        boolean conIsNull = converter == null ? false : true;
        final BeanCopier beanCopier = BeanCopier.create(sourceClass, targetClass, conIsNull);
        beanCopier.copy(source, target, converter);
    }
    /**
     * 拷貝List Bean對(duì)象屬性
     *
     * @param <S>    源bean類(lèi)型
     * @param <T>    目標(biāo)bean類(lèi)型
     * @param source 源bean對(duì)象list
     * @param target 目標(biāo)bean對(duì)象
     * @return 目標(biāo)bean對(duì)象list
     */
    public static <S, T> List<T> copyList(Collection<S> source, Supplier<T> target) {
        return copyList(source, target, null, null);
    }
    /**
     * 拷貝List Bean對(duì)象屬性
     *
     * @param source    源bean對(duì)象list
     * @param target    目標(biāo)bean對(duì)象
     * @param converter 轉(zhuǎn)換器,無(wú)需可傳{@code null}
     * @param <S>       源bean類(lèi)型
     * @param <T>       目標(biāo)bean類(lèi)型
     * @return 目標(biāo)bean對(duì)象list
     * @since 5.4.1
     */
    public static <S, T> List<T> copyList(Collection<S> source, Supplier<T> target, Converter converter) {
        return copyList(source, target, converter, null);
    }
    /**
     * 拷貝List Bean對(duì)象屬性
     *
     * @param source   源bean對(duì)象list
     * @param target   目標(biāo)bean對(duì)象
     * @param callback 回調(diào)對(duì)象
     * @param <S>      源bean類(lèi)型
     * @param <T>      目標(biāo)bean類(lèi)型
     * @return 目標(biāo)bean對(duì)象list
     * @since 5.4.1
     */
    public static <S, T> List<T> copyList(Collection<S> source, Supplier<T> target, BiConsumer<S, T> callback) {
        return copyList(source, target, null, callback);
    }
    /**
     * 拷貝List Bean對(duì)象屬性
     *
     * @param source    源bean對(duì)象list
     * @param target    目標(biāo)bean對(duì)象
     * @param converter 轉(zhuǎn)換器,無(wú)需可傳{@code null}
     * @param callback  回調(diào)對(duì)象
     * @param <S>       源bean類(lèi)型
     * @param <T>       目標(biāo)bean類(lèi)型
     * @return 目標(biāo)bean對(duì)象list
     */
    public static <S, T> List<T> copyList(Collection<S> source, Supplier<T> target, Converter converter, BiConsumer<S, T> callback) {
        return source.stream().map(s -> {
            T t = target.get();
            copy(s, t, converter);
            if (callback != null) {
                callback.accept(s, t);
            }
            return t;
        }).collect(Collectors.toList());
    }
    /**
     * 將Bean轉(zhuǎn)換為Map
     *
     * @param bean Bean對(duì)象
     * @return {@link BeanMap}
     * @since 5.4.1
     */
    public static BeanMap toMap(Object bean) {
        return BeanMap.create(bean);
    }
}

三、測(cè)試拷貝對(duì)象和集合

拷貝對(duì)象測(cè)試,再將拷貝的對(duì)象和源對(duì)象放入集合中對(duì)拷貝集合測(cè)試

 public static void main(String[] args) {
        /**
         * 拷貝對(duì)象
         */
        //創(chuàng)建對(duì)象
        TUser tUser  = new TUser();
        tUser.setName("李四");
        //拷貝對(duì)象
        TUser tUser2 = CglibUtil.copy(tUser,TUser.class);
        //打印結(jié)果
        System.out.println(tUser2.getName());
        /**
         * 拷貝集合
         */
        //創(chuàng)建集合
        List<TUser> list1 = new ArrayList<>();
        list1.add(tUser);
        list1.add(tUser2);
        //拷貝集合
        List<TUser> list2 = CglibUtil.copyList(list1,TUser::new);
        //打印結(jié)果
        System.out.println(JSONObject.toJSONString(list2));
    }

結(jié)果打印

四、注意點(diǎn)

CglibUtil.copy拷貝對(duì)象的時(shí)候,目標(biāo)對(duì)象被lombok注解@Accessors(chain = true)修飾報(bào)空指針

在拷貝對(duì)象上不可用注解 @Accessors ,反射獲取不到對(duì)應(yīng)的setter,因?yàn)檫@個(gè)鏈?zhǔn)缴傻拇a帶了返回值,此注解會(huì)將set方法返回值改變

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot中項(xiàng)目結(jié)構(gòu)的項(xiàng)目實(shí)踐

    SpringBoot中項(xiàng)目結(jié)構(gòu)的項(xiàng)目實(shí)踐

    SpringBoot項(xiàng)目結(jié)構(gòu)遵循Maven或Gradle的標(biāo)準(zhǔn)目錄結(jié)構(gòu),融入了SpringBoot的特定約定,本文就來(lái)介紹一下SpringBoot中項(xiàng)目結(jié)構(gòu)的項(xiàng)目,感興趣的可以了解一下
    2025-03-03
  • springSecurity+jwt使用小結(jié)

    springSecurity+jwt使用小結(jié)

    本文介紹了使用Spring Security與JWT進(jìn)行身份驗(yàn)證和授權(quán),實(shí)現(xiàn)用戶認(rèn)證和授權(quán)的詳細(xì)流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • 初學(xué)者Android studio安裝圖文詳解

    初學(xué)者Android studio安裝圖文詳解

    本文給大家分享android studio 安裝圖文詳解包括下載安裝及遇到的問(wèn)題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09
  • IDEA配置Java類(lèi)方法注釋模板實(shí)踐

    IDEA配置Java類(lèi)方法注釋模板實(shí)踐

    這篇文章主要介紹了IDEA配置Java類(lèi)方法注釋模板實(shí)踐,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2026-03-03
  • Java 結(jié)構(gòu)化并發(fā)Structured Concurrency實(shí)踐舉例

    Java 結(jié)構(gòu)化并發(fā)Structured Concurrency實(shí)踐舉例

    Java21結(jié)構(gòu)化并發(fā)通過(guò)作用域和任務(wù)句柄統(tǒng)一管理并發(fā)生命周期,解決線程泄漏與任務(wù)追蹤問(wèn)題,提升代碼安全性和可觀測(cè)性,其核心目標(biāo)為資源整合、依賴管理、異??刂?適用于復(fù)雜并發(fā)場(chǎng)景,未來(lái)將與JVM集成并擴(kuò)展框架支持,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-09-09
  • Spring中@RestController注解的使用實(shí)現(xiàn)

    Spring中@RestController注解的使用實(shí)現(xiàn)

    @RestController是SpringMVC中用于構(gòu)建RESTful Web服務(wù)的核心注解,結(jié)合@Controller和@ResponseBody功能,自動(dòng)將方法返回值序列化為JSON/XML,感興趣的可以了解一下
    2025-08-08
  • Javaweb動(dòng)態(tài)開(kāi)發(fā)最重要的Servlet詳解

    Javaweb動(dòng)態(tài)開(kāi)發(fā)最重要的Servlet詳解

    動(dòng)態(tài)web的核心是Servlet,由tomcat解析并執(zhí)行,本質(zhì)是Java中的一個(gè)類(lèi)(面向?qū)ο螅┻@個(gè)類(lèi)的功能十分強(qiáng)大幾乎可以完成全部功能,在Java規(guī)范中只有Servlet實(shí)現(xiàn)類(lèi)實(shí)例化的對(duì)象才能被瀏覽器訪問(wèn),所以掌握Servlet具有重要意義
    2022-08-08
  • Java中的xxl-job調(diào)度器線程池工作機(jī)制

    Java中的xxl-job調(diào)度器線程池工作機(jī)制

    xxl-job通過(guò)快慢線程池分離短時(shí)與長(zhǎng)時(shí)任務(wù),動(dòng)態(tài)降級(jí)超時(shí)任務(wù)至慢池,結(jié)合異步觸發(fā)和資源隔離機(jī)制,提升高頻調(diào)度的性能與穩(wěn)定性,支撐高并發(fā)場(chǎng)景下的可靠任務(wù)執(zhí)行,本文給大家介紹Java: xxl-job調(diào)度器線程池工作機(jī)制,感興趣的朋友一起看看吧
    2025-07-07
  • Redis緩存及熱點(diǎn)key問(wèn)題解決方案

    Redis緩存及熱點(diǎn)key問(wèn)題解決方案

    這篇文章主要介紹了Redis緩存及熱點(diǎn)key問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 基于SpringBoot實(shí)現(xiàn)一個(gè)安全可靠的滑塊拼圖驗(yàn)證系統(tǒng)

    基于SpringBoot實(shí)現(xiàn)一個(gè)安全可靠的滑塊拼圖驗(yàn)證系統(tǒng)

    滑塊拼圖驗(yàn)證是一種行為驗(yàn)證技術(shù),通過(guò)要求用戶將拼圖塊拖動(dòng)到正確位置來(lái)區(qū)分人類(lèi)用戶和自動(dòng)化程序,本文給大家介紹了基于SpringBoot實(shí)現(xiàn)滑塊拼圖驗(yàn)證的完整代碼,需要的朋友可以參考下
    2026-03-03

最新評(píng)論

宁国市| 肥西县| 西充县| 灌阳县| 绥化市| 固原市| 永嘉县| 临武县| 怀来县| 赣榆县| 象州县| 宜宾市| 田阳县| 镇安县| 水富县| 昆明市| 集贤县| 叙永县| 历史| 商河县| 永新县| 绍兴县| 乌拉特后旗| 苍山县| 闽清县| 怀化市| 鹰潭市| 江源县| 会泽县| 大余县| 玉门市| 安义县| 新晃| 四会市| 江陵县| 旌德县| 麻江县| 克什克腾旗| 涞水县| 麦盖提县| 屯门区|