Java中Function用于对象或属性转换,核心是重写apply方法;需明确输入输出类型、处理null安全;支持方法引用、链式组合(andThen/compose)及Stream的map操作。

Java 中 Function 接口常用于将一个对象转换为另一个对象或其某个属性,核心是重写 apply(T t) 方法。实现属性转换的关键在于:明确输入类型(源对象)、输出类型(目标属性或新对象),并在 apply 中安全提取并返回所需值。
直接提取单个属性(如 String → String)
适用于从源对象中读取一个字段,返回其值。注意处理 null 安全问题:
- 使用方法引用更简洁,例如
User::getName等价于u -> u.getName() - 若源对象可能为 null,需在 lambda 中判空,避免
NullPointerException - 示例:将
User对象转为其email字符串Function<user string> toEmail = user -> user != null ? user.getEmail() : null;</user>
构造新对象(如 User → UserInfoDTO)
当需要将源对象映射为结构不同的新对象时,在 apply 中手动创建并赋值:
- 推荐使用构造器或 builder 模式初始化目标对象
- 可结合 Optional 避免空指针,例如
Optional.ofNullable(user).map(User::getName).orElse(null) - 示例:把
User转成精简的UserInfoDTOFunction<user userinfodto> toDto = user -> {<br> if (user == null) return null;<br> return new UserInfoDTO(user.getId(), user.getName(), user.getEmail());<br>};</user>
链式转换与组合(andThen / compose)
利用 Function 内置的组合能力,分步处理属性转换逻辑:
-
andThen:先执行当前函数,再对结果做后续处理(后置转换) -
compose:先对输入做预处理,再执行当前函数(前置转换) - 示例:先取 name,再转大写
Function<user string> getName = User::getName;<br>Function<string string> toUpper = String::toUpperCase;<br>Function<user string> fullNameUpper = getName.andThen(toUpper);</user></string></user>
配合 Stream 使用(map 转换集合属性)
最常见场景:对 List
-
stream().map(...)的参数就是Function,可直接传方法引用或 lambda - 注意 map 返回的是新流,原集合不变
- 示例:获取所有用户邮箱列表
List<string> emails = users.stream()<br> .map(User::getEmail) // 等价于 u -> u.getEmail()<br> .filter(Objects::nonNull)<br> .collect(Collectors.toList());</string>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











