javabean拷貝,list拷貝,工具類

可以實現單個對象拷貝,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);
//    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章