Function<T, R>是Java中用于一对一确定性数据转换的函数式接口,核心方法为R apply(T t),支持Lambda、方法引用和匿名内部类实现,常用于集合映射、DTO转换等场景。

Java 中 Function<T, R> 是最常用的转换型函数式接口,用于将一种类型的数据映射为另一种类型。它只有一个抽象方法 R apply(T t),适合做一对一的、确定性的数据转换。
Function 的基本用法和实现方式
你可以通过 Lambda 表达式、方法引用或匿名内部类来实现 Function。Lambda 是最简洁的方式:
-
Lambda 实现:
Function<string integer> strToInt = s -> Integer.parseInt(s);</string> -
方法引用:
Function<string string> toUpper = String::toUpperCase;</string> -
匿名内部类(不推荐,冗长):
new Function<String, Boolean>() { public Boolean apply(String s) { return s != null && !s.trim().isEmpty(); } }
常见数据映射场景示例
实际开发中,Function 常用于集合转换、DTO 与 Entity 映射、字段提取等:
- 把字符串列表转成整数列表:
list.stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList()) - 从对象中提取某个属性:
Function<user string> getName = User::getName;</user>,再配合map(getName)使用 - 组合多个转换:
Function<string string> trimAndUpper = String::trim.andThen(String::toUpperCase);</string>
注意空值与异常处理
Function 本身不处理异常,也不约定是否接受 null。若转换逻辑可能抛出异常(如 parseInt),需自行包装或使用更安全的变体(如自定义 SafeFunction):
立即学习“Java免费学习笔记(深入)”;
- 简单防护:
s -> s == null ? 0 : Integer.parseInt(s) - 捕获异常:
s -> { try { return Integer.parseInt(s); } catch (NumberFormatException e) { return -1; } } - 结合 Optional 可提升健壮性,但需额外封装,
Function接口本身不支持
与其他函数式接口的区别
别混淆类似接口:
-
UnaryOperator<T>是Function<T,T>的子接口,输入输出类型相同,比如字符串去空格、数字取绝对值 -
BiFunction<T,U,R>接收两个参数,适合需要上下文的映射(如(user, config) -> user.getName() + "@" + config.getDomain()) -
Supplier<R>和Consumer<T>不是转换接口:前者只产出,后者只消费,都不返回映射结果


















