function接口是java 8函数式编程核心工具,专用于“一入一出”类型转换;含apply(执行转换)、andthen(后组合)、compose(前组合)及identity(恒等)方法,广泛用于stream.map等声明式数据处理。

Java 中的 Function 接口是函数式编程的核心工具,专用于“一个输入 → 一个输出”的类型转换,天然适合数据提取、格式映射、链式加工等场景。它不负责业务逻辑分支或副作用操作(如 I/O、修改状态),而是聚焦在纯转换上——这点决定了它的简洁性与可组合性。
核心用法:用 apply 完成单步转换
所有转换逻辑都落在 apply(T t) 方法里。只要明确输入类型和期望输出类型,就能构造出精准的转换行为:
- 字符串转整数:Function
parse = s -> Integer.parseInt(s); ,调用 parse.apply("42") 得到 42 - 对象属性提取:Function
getName = User::getName; ,对任意 User 实例返回其姓名 - 数值计算:Function
toCelsius = f -> (f - 32) * 5 / 9; ,实现华氏转摄氏
进阶技巧:用 andThen 和 compose 组合多步处理
单个 Function 只做一步,但真实业务常需串联多个转换。这时不用嵌套调用,直接用接口自带的组合方法:
- andThen:先执行当前函数,再把结果传给后续函数。例如:strToInt.andThen(i -> i * 2).apply("10") 先转整数 10,再乘 2,得 20
- compose:先执行传入函数,再执行当前函数。例如:doubleToString.compose(Math::sqrt).apply(16.0) 先开方得 4.0,再转字符串 "4.0"
- 组合支持任意长度:f1.andThen(f2).andThen(f3) 等价于三步流水线,语义清晰且复用性强
实战落地:配合 Stream 构建声明式处理链
Function 最常见的搭档是 Stream.map()。它接受 Function 作为参数,自动将转换逻辑应用到每个元素上:
- 批量类型转换:List
nums = list.stream().map(Integer::parseInt).collect(Collectors.toList()); - 字段映射+格式化:List
emails = users.stream().map(User::getEmail).map(String::toLowerCase).collect(...); - 结合 filter 或 flatMap 使用:stream.map(toUpper).filter(Objects::nonNull).distinct(),形成完整数据流
注意事项:空值与泛型边界要主动防护
Function 本身不处理 null,一旦输入为 null,apply 很可能抛 NullPointerException:
- 建议在 lambda 内做判空:s -> s == null ? 0 : Integer.parseInt(s)
- 或用 Optional 包装转换逻辑,避免下游暴露空指针风险
- 泛型使用时注意通配符:andThen 的参数类型是 ? super R,compose 是 ? extends T,合理利用可提升类型安全
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











