一、使用背景
在当今复杂的业务场景中,数据的转换和处理几乎是每个项目都绕不开的话题。传统方式中,开发者往往需要编写冗长的代码来实现数据的拷贝、转换和加工,这不仅耗费时间,还容易出现错误。今天,我们将为大家介绍一款优雅且高效的数据转换工具类:DataTransformer
,为您的开发工作提速。
二、工具介绍
2.1 基本介绍
DataTransformer
是一个基于 Java 的通用数据转换工具类,支持深拷贝、回调函数以及列表转换。它的核心设计理念是通过简洁的接口,提升数据转换的灵活性和开发效率。
核心功能包括:
- 单个数据对象的转换:支持简单转换和深拷贝。
- 列表数据转换:可批量处理数据列表。
- 回调支持:支持转换完成后的自定义逻辑。
以下是核心代码的简要概览:
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);
}
}