Lambda表达式可构建通用变量转换器,通过FieldGetter/FieldSetter接口解耦读写逻辑,支持单字段copyField、链式BeanCopier及反射自动映射,提升类型安全与可维护性。

用 Lambda 表达式构建通用变量转换器,核心是把“字段名 → getter/setter 方法引用”抽象成可复用逻辑,避免为每个 DTO/VO 写重复的 setXXX(getXXX()) 映射代码。
提取字段访问行为为函数式接口
定义一个轻量接口,描述“从源对象读取某字段值”的能力:
public interface FieldGetter<s t> {
T get(S source);
}</s>
再补充一个“向目标对象写入某字段值”的接口:
public interface FieldSetter<t v> {
void set(T target, V value);
}</t>
这样就把 getter 和 setter 拆成独立、可组合的函数单元,为后续泛型转换打下基础。
封装通用单字段转换方法
写一个静态工具方法,接收源对象、getter、目标对象、setter,完成一次赋值:
public static <s t v> void copyField(
S source, FieldGetter<s v> getter,
T target, FieldSetter<t v> setter) {
setter.set(target, getter.get(source));
}</t></s></s>
调用时直接传入方法引用,清晰又类型安全:
copyField(user, User::getName, userVO, UserVO::setName); copyField(user, User::getAge, userVO, UserVO::setAge);
构建批量字段映射的 fluent 风格转换器
进一步封装,支持链式注册多个字段映射规则,并一次性执行:
public class BeanCopier<s t> {
private final List<copytask t>> tasks = new ArrayList();
public BeanCopier<s t> map(
FieldGetter<s> getter,
FieldSetter<t> setter) {
tasks.add(new CopyTask(getter, setter));
return this;
}
public void copy(S source, T target) {
tasks.forEach(task -> task.execute(source, target));
}
private static class CopyTask<s t> {
private final FieldGetter<s> getter;
private final FieldSetter<t> setter;
CopyTask(FieldGetter<s> getter, FieldSetter<t> setter) {
this.getter = getter;
this.setter = setter;
}
@SuppressWarnings("unchecked")
void execute(S source, T target) {
setter.set(target, getter.get(source));
}
}
}</t></s></t></s></s></t></s></s></copytask></s>
使用示例:
new BeanCopier<user uservo>()
.map(User::getId, UserVO::setId)
.map(User::getName, UserVO::setName)
.map(User::getEmail, UserVO::setEmail)
.copy(user, userVO);</user>
进阶:自动推断字段名实现零配置映射
若源和目标类字段名、类型完全一致,可用反射+Lambda 获取所有 getter/setter,再按名称匹配(如 getName → setName):
- 遍历源类所有 public getter 方法(返回非 void,无参,命名符合 getXXX/isXXX)
- 提取字段名(getName → name),查找目标类中同名 setter(setName)
- 用 MethodHandle 或直接生成 Lambda(借助 Unsafe 或 LambdaMetafactory)绑定方法调用
- 实际项目中推荐用 MapStruct 或 Dozer 等成熟框架替代手写,但理解其底层思路有助于定制化场景(如忽略 null 值、日期格式转换等)
手动实现全自动映射易出错且性能难控,Lambda 的真正价值在于让显式映射更简洁、类型更安全、维护更直观。










