Java函数式接口转换核心是用Function<T,R>封装带业务逻辑的对象映射,支持字段重命名、类型转换、默认值填充;可通过lambda、andThen组合、Stream批量处理及静态工具类复用,避免反射与序列化。
Java 中函数式接口实现复杂对象转换,核心是用 Function<T, R> 封装映射逻辑,把源类型对象“加工”成目标类型对象,而不是简单拷贝字段。它不依赖反射或序列化,逻辑清晰、可测试、易组合,特别适合字段名不同、类型需转换、含业务规则的场景。
最直接的方式是声明一个 Function<Source, Target>,在 lambda 或方法引用中完成字段提取、类型转换、默认值填充等操作。
User 有 name: String、age: int
UserDTO 有 userName: String、userAge: Integer
Function<User, UserDTO> toDto = u -> { UserDTO dto = new UserDTO(); dto.setUserName("U_" + u.getName()); dto.setUserAge(u.getAge() > 0 ? u.getAge() : 18); return dto; };
dto = toDto.apply(user),一行代码完成带逻辑的转换当转换流程分阶段(比如先转基础结构,再补充计算字段),可用 andThen 把多个 Function 串起来,形成可复用的流水线。
User 转成中间对象 UserVO
UserVO 补充 fullName 字段(如拼接姓和名)Function<User, UserVO> toVo = ...; Function<UserVO, UserDTO> enrich = vo -> { vo.setFullName(vo.getFirstName() + " " + vo.getLastName()); return vo; }; Function<User, UserDTO> fullConvert = toVo.andThen(enrich);
面对 List<User> 到 List<UserDTO> 的批量转换,直接用 stream().map(...).collect(...),无需手写 for 循环。
立即学习“Java免费学习笔记(深入)”;
List<UserDTO> dtos = users.stream() .map(toDto) .collect(Collectors.toList());CompletableFuture 与 Function,保持函数式风格map 中做耗时操作;若需缓存或校验,建议提前封装进 Function 内部项目中多个地方需要相同转换逻辑时,不要重复写 lambda,而是抽成静态方法或专用转换器类。
public class UserConverters { public static final Function<User, UserDTO> TO_DTO = u -> new UserDTO(u.getName(), u.getAge()); }
userDto = UserConverters.TO_DTO.apply(user);
Function<User, UserDTO> ctor = UserDTO::new;(前提是构造器参数顺序和类型匹配)@Builder 和 builder 模式,lambda 内部更简洁