function接口是java 8函数式编程基石,专用于“一个输入→一个输出”的纯转换;核心为apply方法,支持null防护封装、andthen/compose组合及stream.map集成。

Function 接口是 Java 8 函数式编程的基石,专为“一个输入 → 一个输出”的数据转换场景设计。它不负责副作用、不处理分支逻辑,只做干净、可复用的类型或值映射。
核心就是 apply 方法
Function
- 比如把字符串转成整数:
Function<string integer> parse = s -> Integer.parseInt(s);</string>,调用parse.apply("42")得到42 - 再比如从对象中取字段:
Function<user string> getName = User::getName;</user>,调用getName.apply(user)返回用户名 - 注意:如果输入可能为 null,需自行防护,例如
s -> s == null ? "N/A" : s.trim()
封装常用转换逻辑,避免重复判断
把带校验、默认值、异常处理的转换逻辑抽成静态 Function 常量,哪用哪取,改一处全生效。
- 例如安全转整数:
public static final Function<string integer> SAFE_PARSE_INT = s -> { try { return s == null ? 0 : Integer.parseInt(s); } catch (NumberFormatException e) { return 0; } };</string> - 再如金额格式化:
Function<bigdecimal string> formatMoney = bd -> bd == null ? "0.00" : bd.setScale(2, HALF_UP).toString();</bigdecimal> - 这类封装特别适合 DTO 转 VO、前端参数预处理、日志字段提取等高频场景
组合多个转换步骤(andThen / compose)
当转换需要多步时,别写嵌套调用,用 andThen 串起来,语义清晰、类型安全。
-
andThen:先执行当前函数,再执行下一个 —— 更符合阅读顺序
例:Function<string string> trim = s -> s.trim();<br>Function<string string> upper = s -> s.toUpperCase();<br>Function<string string> normalize = trim.andThen(upper);<br>normalize.apply(" hello "); // → "HELLO"</string></string></string> -
compose:先执行参数函数,再执行当前函数 —— 适合前置预处理
例:Function<string integer> len = s -> s.length();<br>Function<integer boolean> isEven = i -> i % 2 == 0;<br>Function<string boolean> isLengthEven = isEven.compose(len);<br>isLengthEven.apply("abc"); // → true(长度3?不对,是"ab"才对 → 实际结果为 false)</string></integer></string> - 组合链中任意一环类型不匹配,编译直接报错,比运行时报空指针更早暴露问题
和 Stream 配合做集合批量转换
Stream 的 map 方法参数就是 Function,天然契合。把单个元素的转换逻辑定义好,一行 map 就完成整个列表处理。
- 例:把用户列表转成姓名列表
List<string> names = users.stream()<br> .map(User::getName)<br> .filter(Objects::nonNull)<br> .collect(Collectors.toList());</string>
- 也可复用已定义的 Function:
.map(SAFE_PARSE_INT)或.map(normalize) - 注意:map 只管转换,过滤、聚合、排序等职责应交给 filter、reduce、sorted 等其他操作,保持各司其职
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











