Lambda 表达式结合 Function 接口可实现轻量、可控的 DTO/POJO 转换,支持单字段映射、对象转换、链式组合(andThen/compose)、泛型工具方法(mapList + 构造器引用)及 Optional 空值安全处理。

直接用 Lambda 表达式构建轻量、可复用的变量转换器,能绕过重量级框架(如 MapStruct 或 ModelMapper),在不引入额外依赖的前提下,把 DTO 与 POJO 之间的字段映射逻辑写得清晰又可控。
用 Function 接口封装单字段映射
Java 的 Function<T, R> 是最自然的转换载体。它接收一个源类型,返回一个目标类型,正适合字段级或对象级的一对一转换。
- 单字段转换示例:将 UserEntity 的 name 字段转为 UserDTO 的 username
Function<UserEntity, String> toUsername = user -> user.getName();
String username = toUsername.apply(entity);
- 整个对象转换也可用 Function 封装,避免每个 controller 都 new DTO
Function<UserEntity, UserDTO> toDto = user -> new UserDTO(user.getId(), user.getName(), user.getEmail());
UserDTO dto = toDto.apply(entity);
组合多个 Function 实现链式转换
当 DTO 和 POJO 字段名不一致、需加工或存在嵌套时,可组合多个 Function,提升复用性。
- 先提取再格式化:比如把出生日期转为“yyyy-MM-dd”字符串
Function<UserEntity, LocalDate> extractDob = UserEntity::getBirthDate;
Function<LocalDate, String> formatDob = d -> d.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
Function<UserEntity, String> dobAsString = extractDob.andThen(formatDob);
- andThen() 和 compose() 可灵活控制执行顺序,无需写 if/else 或临时变量
泛型 + 方法引用构建通用转换器工厂
把重复的 new DTO(newObj) 抽成静态工具方法,配合构造器引用(ClassName::new)实现零样板对象转换。
- 定义通用转换方法:
public static <S, T> List<T> mapList(Collection<S> source, Function<S, T> mapper) {
return source.stream().map(mapper).collect(Collectors.toList());
}
- 调用时直接传构造器引用,语义明确且无反射开销:
List<UserDTO> dtos = mapList(users, UserDTO::new); // 前提是 UserDTO 有 UserEntity 构造函数
List<String> names = mapList(users, UserEntity::getName);
配合 Optional 处理空值,避免 NPE
实体字段可能为 null,DTO 字段却要求非空默认值(如空字符串、0、false)。Lambda + Optional 能优雅兜底。
- 安全取值并设默认值:
Function<UserEntity, String> safeName = u -> Optional.ofNullable(u)
.map(UserEntity::getName)
.orElse("N/A");
- 比 if (u != null && u.getName() != null) ... 简洁得多,也更符合函数式风格

















