function是java中典型函数式接口,用于将t类型输入映射为r类型输出,支持apply()调用及andthen/compose组合,广泛用于stream.map、optional.map等场景。

Java 中的 Function<t r></t> 是最常用、最典型的函数式接口,核心作用是“把一个类型的数据转换成另一个类型”。它不执行副作用,不修改状态,只专注输入到输出的映射关系。
Function 的基本用法
它的抽象方法是 R apply(T t) —— 接收一个 T 类型参数,返回一个 R 类型结果。只要满足这个签名,就能用 Lambda 或方法引用创建实例。
- 字符串转整数:
Function<string integer> strToInt = Integer::parseInt;</string> - 获取字符串长度:
Function<string integer> length = String::length;</string> - 数字平方:
Function<integer integer> square = x -> x * x;</integer>
调用时统一用 .apply() 方法:int result = strToInt.apply("42"); // 得到 42
Function 的组合能力:andThen 和 compose
真正让 Function 强大的,是它自带的两个组合方法——不用嵌套调用,就能串起处理逻辑。
-
andThen:先执行当前函数,再执行传入的函数。
例如:strToInt.andThen(x -> x * 2)表示“先转整数,再乘以 2” -
compose:先执行传入的函数,再执行当前函数。
例如:strToInt.compose(String::trim)表示“先去空格,再转整数”
两者返回的仍是 Function,支持链式叠加:trim.andThen(parseInt).andThen(toString)
Function 在 Stream 中的典型场景
它大量出现在 Stream API 的中间和终止操作中:
-
stream.map(strToInt)—— 转换元素类型(如字符串列表 → 整数列表) -
stream.collect(Collectors.toMap(Function.identity(), String::length))—— 用 identity 当 key,length 当 value 构建 map -
Optional.map(transformer)—— 对非空值做安全转换
注意几个实用细节
使用时容易忽略但很关键的点:
- 泛型类型必须匹配:compose 的参数函数返回类型,必须和当前函数的输入类型一致;andThen 的参数函数输入类型,必须和当前函数的返回类型一致
- 可为 null:Function 实例本身可以为 null,但调用
apply()时若传入 null,行为取决于具体实现(比如Integer::parseInt遇到 null 会抛 NPE) - 不强制加 @FunctionalInterface:java.util.function.Function 本身已标注,自定义类似接口时建议加上,便于编译期检查
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











