【工具】 - BeanUtils增强篇
阅读原文时间:2023年07月10日阅读:2
public class BeanPlusUtils extends BeanUtils {
    public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target) {
        return copyListProperties(sources, target, null);
    }

    public static <S, T> T copySingleProperties(S source, Supplier<T> target) {
        return copySingleProperties(source, target, null);
    }

    /**
     * 使用场景:Entity、Bo、Vo层数据的复制,因为BeanUtils.copyProperties只能给目标对象的属性赋值,却不能在List集合下循环赋值,因此添加该方法
     * 如:List<AdminEntity> 赋值到 List<AdminVo> ,List<AdminVo>中的 AdminVo 属性都会被赋予到值
     * S: 数据源类 ,T: 目标类::new(eg: AdminVo::new)
     */
    public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target,
                                                    ColaBeanUtilsCallBack<S, T> callBack) {
        if (CollectionUtils.isEmpty(sources)){
            return new ArrayList<>();
        }
        List<T> list = new ArrayList<>(sources.size());
        for (S source : sources) {
            T t = target.get();
            copyProperties(source, t);
            list.add(t);
            if (callBack != null) {
                // 回调
                callBack.callBack(source, t);
            }
        }
        return list;
    }

    public static <S, T> T copySingleProperties(S source, Supplier<T> target, ColaBeanUtilsCallBack<S, T> callBack) {
        T t = target.get();
        copyProperties(source, t);
        if (callBack != null) {
            // 回调
            callBack.callBack(source, t);
        }
        return t;
    }

    @FunctionalInterface
    public interface ColaBeanUtilsCallBack<S, T> {

        void callBack(S t, T s);
    }

    /**
     * 将集合对象中的类型转换成另一种类型
     *
     * @param collection 集合
     * @param clazz      目标对象
     * @param <T>
     * @return
     */
    public static <T> Collection<T> covertObject(Collection<?> collection, Class<T> clazz) {
        Collection<T> newCollection = collection.stream().map(oldObject -> {
            T instance = null;
            try {
                instance = clazz.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            BeanUtils.copyProperties(oldObject, instance);
            return instance;
        }).collect(Collectors.toList());
        return newCollection;
    };
}