Java中Function接口的andThen方法实现顺序执行,即先执行当前函数再执行参数函数,形成从左到右的转换链;它是Function接口的默认方法,接收一个Function参数。

Java 中函数式接口通过 Function 的 andThen 方法实现顺序执行,核心是“先当前函数,再后续函数”,形成从左到右可读的转换链条。
andThen 的执行逻辑和签名含义
andThen 是 Function<t r></t> 接口的默认方法,接收一个 Function super R, ? extends V> 类型的参数,返回一个新的 Function<t v></t>。它不改变原函数,而是生成一个组合后的新函数:
- 输入类型保持为原始函数的输入类型
T - 输出类型变为后续函数的输出类型
V - 内部调用顺序固定:先
apply(t)(当前函数),再对结果调用after.apply(...)(后续函数)
实际写法:Lambda + andThen 链式组合
直接用 Lambda 定义单步函数,再用 andThen 串起来,语义清晰、无需临时变量:
Function<String, String> trim = s -> s.trim();
Function<String, String> upper = s -> s.toUpperCase();
Function<String, String> cleanAndUppercase = trim.andThen(upper);
String result = cleanAndUppercase.apply(" hello world "); // "HELLO WORLD"
也可以连续调用多次 andThen,比如加空格替换:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
trim.andThen(upper).andThen(s -> s.replace(" ", "_"))- 等价于
s -> s.trim().toUpperCase().replace(" ", "_"),但职责更分明
配合 Stream.map 构建数据流水线
在集合处理中,andThen 组合的函数可直接传给 Stream.map(),让转换逻辑集中、复用性强:
List<String> inputs = Arrays.asList(" a ", " bbb ", " Cc ");
Function<String, String> normalize = s -> s.trim().toLowerCase();
List<String> outputs = inputs.stream()
.map(normalize.andThen(s -> s + "!"))
.collect(Collectors.toList()); // ["a!", "bbb!", "cc!"]
相比在 map 内写长表达式,拆成可命名的函数组合更易测试、调试和复用。
注意事项:类型匹配与 null 安全
andThen 要求前一个函数的输出类型必须能作为后一个函数的输入类型,编译期强制校验:
- 错误示例:
Function<String, Integer> len = String::length;后接andThen(s -> s.toUpperCase())→ 编译失败(Integer无法传给String参数) - 若中间步骤可能返回
null,需提前防护,例如用Objects.toString(x, "")或 Optional 封装 - 避免在组合函数中引入副作用(如打印、修改外部状态),否则执行顺序不易追踪

















