function 是 java 8 引入的函数式接口,用于“一个输入→一个输出”的类型安全转换,核心方法为 apply(t),支持 lambda、方法引用及链式调用 andthen/compose,常用于 stream.map、dto 转换等场景,但不处理异常且不接受 null 输入。

Function 是 Java 8 引入的核心函数式接口之一,定义在 java.util.function 包中,专门用于实现“一个输入 → 一个输出”的类型安全转换逻辑。
接口定义与基本用法
它的函数签名是:public interface Function<t r> { R apply(T t); }</t>
其中 T 是输入类型,R 是返回类型。只要实现 apply() 方法,就完成了从输入到输出的转换。
常见写法包括:
- 使用 Lambda 表达式(最常用):
Function<string integer> strToInt = s -> Integer.parseInt(s);</string> - 使用方法引用:
Function<string string> toUpper = String::toUpperCase;</string> - 使用匿名内部类(较少用):
Function<integer boolean> isEven = new Function() { public Boolean apply(Integer n) { return n % 2 == 0; } };</integer>
链式转换:andThen 与 compose
Function 提供两个默认方法,支持多个转换逻辑串联:
-
andThen(R):先执行当前函数,再执行参数函数(正向链式)Function<string integer> parse = s -> Integer.parseInt(s);<br> Function<integer string> toString = i -> "Result: " + i;<br> Function<string string> pipeline = parse.andThen(toString);<br> String result = pipeline.apply("123"); // → "Result: 123"</string></integer></string> -
compose(T):先执行参数函数,再执行当前函数(反向链式)Function<integer string> format = i -> "[" + i + "]";<br> Function<string string> fullPipeline = format.compose(parse);<br> String out = fullPipeline.apply("456"); // → "[456]"</string></integer>
实际应用场景举例
Function 常用于数据映射、DTO 转 VO、配置解析等场景:
- 将用户 ID 字符串转为 Long 并查库:
Function<string user> findById = idStr -> userDao.findById(Long.parseLong(idStr));</string> - 统一字段格式化(如脱敏手机号):
Function<string string> maskPhone = phone -> phone.replaceAll("(\d{3})\d{4}(\d{4})", "$1****$2");</string> - 配合 Stream.map 使用:
List<string> names = users.stream()<br> .map(User::getName)<br> .map(String::toUpperCase)<br> .collect(Collectors.toList());</string>
这里每个map()参数本质都是Function实例。
注意事项与限制
使用时需注意几点:
- 输入和输出类型必须明确,泛型不可省略(除非类型推断成立);
-
apply()方法不接受 null 输入(除非你主动处理),否则可能抛NullPointerException; - 它不支持异常抛出 —— 若转换过程可能出错(如解析失败),应自行 try-catch 或改用自定义函数式接口(如
CheckedFunction); - 不可变性:Function 实例本身不保存状态,适合无副作用的纯转换逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











