javabean拷贝,list拷贝,工具类

11 篇文章 0 订阅
5 篇文章 0 订阅

可以实现单个对象拷贝,List拷贝,源和目标类属性字段不一致时也可以拷贝。

回调类:

用于处理在拷贝过程中源和目标类字段不一致的情况

/**  
* <p>Title: BeanCopierUtilCallBack</p>  
* <p>Description: bean拷贝回调方法</p>  
* @author wangzhj 
* @date 2020年6月2日  
*/
@FunctionalInterface
public interface BeanCopierUtilCallBack<S, T> {
     /**
      * 默认回调方法
      * @param s 
      * @param t
      */
     void callBack(S t, T s);
}

拷贝工具类,基于cglib实现:

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

import net.sf.cglib.beans.BeanCopier;

/**  
* <p>Title: BeanCopier</p>  
* <p>Description: bean复制工具,利用cglib来实现,相比用反射机制实现性能更高</p>  
* @author wangzhj 
* @date 2020年6月2日  
*/
public class BeanCopierUtil {

    public static void copy(Object from, Object to) {
        BeanCopier copier = BeanCopier.create(from.getClass(), to.getClass(), false);  
        copier.copy(from, to, null);  
    }
    
    public static <T> T copy(Object from, Supplier<T> to,Class<T> clazz) {
        BeanCopier copier = BeanCopier.create(from.getClass(), clazz, false);  
        T t = to.get();
        copier.copy(from, t, null);  
        return t;
    }
    
    /**
     * 集合数据的拷贝
     * @param sources: 数据源类
     * @param target: 目标类::new(eg: UserVO::new)
     * @return
     */
    public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target) {
        return copyListProperties(sources, target, null);
    }


    /**
     * 带回调函数的集合数据的拷贝(可自定义字段拷贝规则)
     * @param sources: 数据源类
     * @param target: 目标类::new(eg: UserVO::new)
     * @param callBack: 回调函数
     * @return
     */
    public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target, BeanCopierUtilCallBack<S, T> callBack) {
        List<T> list = new ArrayList<>(sources.size());
        for (S source : sources) {
            T t = target.get();
            copy(source, t);
            list.add(t);
            if (callBack != null) {
                // 回调
                callBack.callBack(source, t);
            }
        }
        return list;
    }
    
    
//    @Test
//    public void listCopyUpWithCallback() {
//        List<UserDO> userDOList = new ArrayList();
//        userDOList.add(new UserDO(1L, "Van", 18, 1));
//        userDOList.add(new UserDO(2L, "VanVan", 20, 2));
//        List<UserVO> userVOList = BeanCopyUtil.copyListProperties(userDOList, UserVO::new, (userDO, userVO) ->{
//            // 这里可以定义特定的转换规则
//            userVO.setSex(SexEnum.getDescByCode(userDO.getSex()).getDesc());
//        });
//        log.info("userVOList:{}",userVOList);
//    }
}

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值