👻优雅的数据转换工具:一站式解决数据处理

177 阅读6分钟

一、使用背景

在当今复杂的业务场景中,数据的转换和处理几乎是每个项目都绕不开的话题。传统方式中,开发者往往需要编写冗长的代码来实现数据的拷贝、转换和加工,这不仅耗费时间,还容易出现错误。今天,我们将为大家介绍一款优雅且高效的数据转换工具类:DataTransformer,为您的开发工作提速。

二、工具介绍

2.1 基本介绍

DataTransformer 是一个基于 Java 的通用数据转换工具类,支持深拷贝、回调函数以及列表转换。它的核心设计理念是通过简洁的接口,提升数据转换的灵活性和开发效率。

核心功能包括:

  1. 单个数据对象的转换:支持简单转换和深拷贝。
  2. 列表数据转换:可批量处理数据列表。
  3. 回调支持:支持转换完成后的自定义逻辑。

以下是核心代码的简要概览:

public static <P, R> R transform(@NotNull P p, @NotNull DataTransformerSupplier<R> transformer) {
    R r = transformer.get();
    copyObj(p, r, false);
    return r;
}
public static <P, R> List<R> transformList(@NotNull List<P> pList, @NotNull DataTransformerSupplier<R> transformer) {
    List<R> rList = new ArrayList<>(pList.size());
    for (P p : pList) {
        R r = transformer.get();
        copyObj(p, r, false);
        rList.add(r);
    }
    return rList;
}

2.2 特性解析

2.2.1 通用性

DataTransformer 提供了灵活的泛型支持,开发者可以轻松处理任意类型的数据,无需额外的类型转换逻辑。

UserDTO dto = DataTransformer.transform(user, UserDTO::new);

2.2.2 深拷贝支持

在深拷贝模式下,DataTransformer 使用 JSON 转换来确保对象属性的完全隔离,避免共享引用带来的数据污染,只需要在最后的参数上面加上true即可实现深拷贝支持。

PersonVo transform1 = DataTransformer.transform(person, PersonVo::new, (p, r) -> {
    r.setName("1122");
    r.setAge(p.getAge());
}, true);

2.2.3 回调机制

通过回调接口,开发者可以在数据转换完成后执行额外的逻辑,比如日志记录或数据补全:

PersonVo transform0 = DataTransformer.transform(person, PersonVo::new, r -> {
    r.setName("1122");
    r.setAge(12);
});

2.2.4 列表支持

无论是处理单个对象还是数据列表,DataTransformer 都能优雅应对:

List<UserDTO> dtos = DataTransformer.transformList(users, UserDTO::new, true);

三、文章总结

DataTransformer 是一个高效、灵活且易于扩展的数据转换工具类。在各种业务场景下,它都能帮助开发者简化代码逻辑,提高开发效率。无论是处理单个对象还是复杂的数据列表,有了 DataTransformer,数据转换不再是难题。立即将 DataTransformer 引入您的项目,享受优雅的开发体验吧!🍓

五、附上代码

/**
 * @author: yangp
 * @date: 2024-12-19
 * @description: 数据转换工具类
 * @version: 1.0
 */
public class DataTransformer {
    /**
     * 数据转换
     *
     * @param p           数据
     * @param transformer 转换器
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据
     */
    public static <P, R> R transform(@NotNull P p, @NotNull DataTransformerFunction<P, R> transformer) {
        Objects.requireNonNull(p, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        return transformer.get(p);
    }

    /**
     * 数据转换
     *
     * @param p           数据
     * @param transformer 转换器
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据
     */
    public static <P, R> R transform(@NotNull P p, @NotNull DataTransformerSupplier<R> transformer) {
        Objects.requireNonNull(p, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        R r = transformer.get();
        copyObj(p, r, false);
        return r;
    }

    /**
     * 数据转换
     *
     * @param p           数据
     * @param transformer 转换器
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据
     */
    public static <P, R> R transform(@NotNull P p, @NotNull DataTransformerSupplier<R> transformer, @NotNull Boolean deepCopy) {
        Objects.requireNonNull(p, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        R r = transformer.get();
        copyObj(p, r, deepCopy);
        return r;
    }

    /**
     * 数据转换
     *
     * @param p           数据列表
     * @param transformer 转换器
     * @param callBack    回调
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据列表
     */
    public static <P, R> R transform(@NotNull P p, @NotNull DataTransformerSupplier<R> transformer, @NotNull DataTransformerCallBack<R> callBack, Boolean deepCopy) {
        Objects.requireNonNull(p, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        Objects.requireNonNull(callBack, "Callback 不能为 null");
        R r = transformer.get();
        copyObj(p, r, deepCopy);
        callBack.get(r);
        return r;
    }

    /**
     * 数据转换
     *
     * @param p           数据列表
     * @param transformer 转换器
     * @param callBack    回调
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据列表
     */
    public static <P, R> R transform(@NotNull P p, @NotNull DataTransformerSupplier<R> transformer, @NotNull DataTransformerCallBack<R> callBack) {
        Objects.requireNonNull(p, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        Objects.requireNonNull(callBack, "Callback 不能为 null");
        R r = transformer.get();
        copyObj(p, r, false);
        callBack.get(r);
        return r;
    }

    /**
     * 数据转换
     *
     * @param p           数据列表
     * @param transformer 转换器
     * @param callBack    回调
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据列表
     */
    public static <P, R> R transform(@NotNull P p, @NotNull DataTransformerSupplier<R> transformer, @NotNull DataTransformerCallBack2<P, R> callBack) {
        Objects.requireNonNull(p, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        Objects.requireNonNull(callBack, "Callback 不能为 null");
        R r = transformer.get();
        copyObj(p, r, false);
        callBack.get(p, r);
        return r;
    }

    /**
     * 数据转换
     *
     * @param p           数据列表
     * @param transformer 转换器
     * @param callBack    回调
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据列表
     */
    public static <P, R> R transform(@NotNull P p, @NotNull DataTransformerSupplier<R> transformer, @NotNull DataTransformerCallBack2<P, R> callBack, Boolean deepCopy) {
        Objects.requireNonNull(p, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        Objects.requireNonNull(callBack, "Callback 不能为 null");
        R r = transformer.get();
        copyObj(p, r, deepCopy);
        callBack.get(p, r);
        return r;
    }


    /**
     * 数据转换
     *
     * @param pList       数据列表
     * @param transformer 转换器
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据列表
     */
    public static <P, R> List<R> transformList(@NotNull List<P> pList, @NotNull DataTransformerSupplier<R> transformer, @NotNull Boolean deepCopy) {
        Objects.requireNonNull(pList, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        List<R> rList = new ArrayList<>(pList.size());
        for (P p : pList) {
            R r = transformer.get();
            copyObj(p, r, deepCopy);
            rList.add(r);
        }
        return rList;
    }

    /**
     * 数据转换
     *
     * @param pList       数据列表
     * @param transformer 转换器
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据列表
     */
    public static <P, R> List<R> transformList(@NotNull List<P> pList, @NotNull DataTransformerSupplier<R> transformer) {
        Objects.requireNonNull(pList, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        List<R> rList = new ArrayList<>(pList.size());
        for (P p : pList) {
            R r = transformer.get();
            copyObj(p, r, false);
            rList.add(r);
        }
        return rList;
    }

    /**
     * 数据转换
     *
     * @param pList       数据列表
     * @param transformer 转换器
     * @param callBack    回调
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据列表
     */
    public static <P, R> List<R> transformList(@NotNull List<P> pList, @NotNull DataTransformerSupplier<R> transformer, @NotNull DataTransformerCallBack<R> callBack, Boolean deepCopy) {
        Objects.requireNonNull(pList, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        Objects.requireNonNull(callBack, "Callback 不能为 null");
        List<R> rList = new ArrayList<>(pList.size());
        for (P p : pList) {
            R r = transformer.get();
            copyObj(p, r, deepCopy);
            callBack.get(r);
            rList.add(r);
        }
        return rList;
    }

    /**
     * 数据转换
     *
     * @param pList       数据列表
     * @param transformer 转换器
     * @param callBack    回调
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据列表
     */
    public static <P, R> List<R> transformList(@NotNull List<P> pList, @NotNull DataTransformerSupplier<R> transformer, @NotNull DataTransformerCallBack<R> callBack) {
        Objects.requireNonNull(pList, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        Objects.requireNonNull(callBack, "Callback 不能为 null");
        List<R> rList = new ArrayList<>(pList.size());
        for (P p : pList) {
            R r = transformer.get();
            copyObj(p, r, false);
            callBack.get(r);
            rList.add(r);
        }
        return rList;
    }

    /**
     * 数据转换
     *
     * @param pList       数据列表
     * @param transformer 转换器
     * @param callBack    回调
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据列表
     */
    public static <P, R> List<R> transformList(@NotNull List<P> pList, @NotNull DataTransformerSupplier<R> transformer, @NotNull DataTransformerCallBack2<P, R> callBack) {
        Objects.requireNonNull(pList, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        Objects.requireNonNull(callBack, "Callback 不能为 null");
        List<R> rList = new ArrayList<>(pList.size());
        for (P p : pList) {
            R r = transformer.get();
            copyObj(p, r, false);
            callBack.get(p, r);
            rList.add(r);
        }
        return rList;
    }

    /**
     * 数据转换
     *
     * @param pList       数据列表
     * @param transformer 转换器
     * @param callBack    回调
     * @param <P>         数据类型
     * @param <R>         转换后的数据类型
     * @return 转换后的数据列表
     */
    public static <P, R> List<R> transformList(@NotNull List<P> pList, @NotNull DataTransformerSupplier<R> transformer, @NotNull DataTransformerCallBack2<P, R> callBack, Boolean deepCopy) {
        Objects.requireNonNull(pList, "输入数据不能为 null");
        Objects.requireNonNull(transformer, "Transformer 不能为 null");
        Objects.requireNonNull(callBack, "Callback 不能为 null");
        List<R> rList = new ArrayList<>(pList.size());
        for (P p : pList) {
            R r = transformer.get();
            copyObj(p, r, deepCopy);
            callBack.get(p, r);
            rList.add(r);
        }
        return rList;
    }

    /**
     * 对象拷贝
     *
     * @param p   入参
     * @param r   回参
     * @param <P> 入参类型
     * @param <R> 回参类型
     */
    private static <P, R> void copyObj(@NotNull P p, @NotNull R r, @NotNull Boolean deepCopy) {
        if (Boolean.TRUE.equals(deepCopy)) {
            // 深拷贝
            P bean = (P) JSONUtil.toBean(JSONUtil.toJsonStr(p), p.getClass());
            BeanUtils.copyProperties(bean, r);
            return;
        }
        BeanUtils.copyProperties(p, r);
    }


    @FunctionalInterface
    public interface DataTransformerFunction<P, R> {
        /**
         * 数据转换
         *
         * @param p 数据
         * @return 转换后的数据
         */
        R get(P p);
    }

    @FunctionalInterface
    public interface DataTransformerSupplier<R> {
        /**
         * 数据转换
         *
         * @return 转换后的数据
         */
        R get();
    }

    @FunctionalInterface
    public interface DataTransformerCallBack<R> {
        /**
         * 数据转换
         *
         * @param target 目标数据
         */
        void get(R target);
    }


    @FunctionalInterface
    public interface DataTransformerCallBack2<P, R> {
        /**
         * 数据转换
         *
         * @param p 入参
         * @param r 回参
         */
        void get(P p, R r);
    }
}