Lambda表达式实现通用变量转换器,核心是将字段映射关系封装为可传递、可复用的Function与BiConsumer函数,配合Supplier构造目标对象,实现DTO→VO的零反射、类型安全转换。

用 Lambda 表达式实现通用变量转换器,核心不是写一堆 if-else 或手动 set,而是把“字段映射关系”变成可传递、可复用的函数逻辑。关键在于:让转换行为本身成为参数,而不是把每个 DTO 都写死一套转换方法。
用 Function 接口封装字段提取逻辑
DTO → VO 的本质,是把源对象的某些字段值,按规则填充到目标对象中。Lambda 可以直接表达这种“取—赋”关系:
- 不依赖第三方工具类(如 BeanUtils),避免反射开销和运行时异常
- 用 Function<Source, T> 提取源字段值,例如
User::getUsername、user -> user.getProfile().getEmail() - 用 BiConsumer<Target, T> 设置目标字段,例如
Vo::setUsername、(vo, email) -> vo.setEmail(email)
构造泛型转换方法,一次定义,多处复用
写一个静态通用方法,接收源对象、字段提取器、字段设置器,返回转换后的 VO:
public static <S, T, R> T convert(S source, Function<S, R> extractor, BiConsumer<T, R> setter, Supplier<T> constructor) {
T target = constructor.get();
R value = extractor.apply(source);
setter.accept(target, value);
return target;
}
调用示例:
convert(user, User::getEmail, Vo::setEmail, Vo::new)convert(order, o -> o.getAddress().getCity(), Vo::setCity, Vo::new)
批量转换列表,配合 Stream + map 一行完成
面对集合场景,直接链式调用,无需循环手动 new:
users.stream().map(u -> convert(u, User::getName, Vo::setName, Vo::new)).collect(Collectors.toList())- 进一步封装为
toListConverter(User::getId, Vo::setId)方法,复用更轻量
支持组合与默认值,增强实用性
Lambda 天然支持逻辑组合,比如空值兜底、格式转换等:
- 用
user -> Optional.ofNullable(user.getPhone()).orElse("N/A")替代冗长判空 - 用
user -> user.getCreatedAt().format(DateTimeFormatter.ISO_DATE)直接完成类型+格式转换 - 多个字段可拆成多个 convert 调用,或封装为 Consumer 链式赋值

















