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

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

















