对象属性深拷贝工具DozerBeanMapper封装

前段时间我分享了两个对象属性拷贝工具,Spring的BeanUtils以及CGLIB的BeanCopier的封装类,之所以封装就是因为直接使用原始的类的话,使用方式不够统一,且略微复杂。上面两个工具都是浅拷贝,今天分享的则是深拷贝。
感兴趣的移步:
封装BeanCopier工具,支持单个对象以及列表拷贝,超高性能简单实用
代码片段:BeanUtils.copyProperties扩展复制列表

深拷贝DozerBeanMapper封装

import org.dozer.DozerBeanMapper;
import org.dozer.Mapper;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 单个对象属性拷贝、列表对象拷贝
 * <p>
 * 拷贝类型:深拷贝
 * 浅拷贝见CopierUtil
 *
 * @author itoak
 */
public class MapperUtil {

    /**
     * 单个对象属性拷贝
     *
     * @param source 源对象
     * @param clazz  目标对象Class
     * @param <T>    目标对象类型
     * @param <M>    源对象类型
     * @return 目标对象
     */
    public static <T, M> T copyProperties(M source, Class<T> clazz) {
        if (Objects.isNull(source) || Objects.isNull(clazz))
            throw new IllegalArgumentException();
        Mapper mapper = BeanHolder.MAPPER.getMapper();
        return mapper.map(source, clazz);
    }

    /**
     * 列表对象拷贝
     *
     * @param sources 源列表
     * @param clazz   源列表对象Class
     * @param <T>     目标列表对象类型
     * @param <M>     源列表对象类型
     * @return 目标列表
     */
    public static <T, M> List<T> copyObjects(List<M> sources, Class<T> clazz) {
        if (Objects.isNull(sources) || Objects.isNull(clazz) || sources.isEmpty())
            throw new IllegalArgumentException();
        return Optional.of(sources)
                .orElse(new ArrayList<>())
                .stream().map(m -> copyProperties(m, clazz))
                .collect(Collectors.toList());
    }

    /**
     * 单例
     * <p>
     * DozerBeanMapper使用单例,有利于提高程序性能
     */
    private enum BeanHolder {
        MAPPER;

        private DozerBeanMapper mapper;

        BeanHolder() {
            this.mapper = new DozerBeanMapper();
        }

        public DozerBeanMapper getMapper() {
            return mapper;
        }
    }
}

深浅拷贝的含义应该不用多说,至于工具的选择,需要开发自己去选择,如果一个对象只包含基本字段属性,可以优先考虑使用BeanCopier,但是这个工具需要依赖CGLIB包,如果不想依赖,则考虑使用Spring的BeanUtils,如果对象包含自定义类字段属性,再拷贝的时候推荐使用DozerBeanMapper工具。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值