选compose还是andthen取决于函数角色:守门员用compose(前置处理),加工员用andthen(后续处理);核心是原始输入数据谁先拿到,需严格匹配类型,避免顺序错位。

核心就一点:谁先拿到原始输入数据。选 compose 还是 andThen,不是看“方向”,而是看你当前写的函数在流程里是“守门员”还是“加工员”。
andThen:我先干,再把结果交给别人
适合你手上的函数是流程起点或中间环节,想顺次往后传。语义直白:“我做完,你接着来”。
- 调用形式:f.andThen(g),等价于数学上的 g(f(x))
- 类型要求:f 的输出类型必须和 g 的输入类型一致
- 典型场景:字符串清洗链——trim → toUpperCase → substring
- 写法自然,从左到右读,符合多数人直觉
compose:别人先干,结果给我处理
适合你手上的函数需要前置条件,比如校验、预转换、参数适配。语义是:“你先搞定输入,我再接手”。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 调用形式:f.compose(g),等价于数学上的 f(g(x))
- 类型要求:g 的输出类型必须和 f 的输入类型一致
- 典型场景:权限检查 → 查用户 → 取等级;这里 authCheck 是守门员,查库函数是主力,就该用 findById.compose(authCheck)
- 阅读顺序是从右往左,但逻辑更贴近“加一道前置步骤”
别踩这两个坑
类型不匹配和顺序错位是最常出问题的地方。
- 编译报错?先盯住泛型:f.compose(g) 中,g 的输出必须能当 f 的输入;f.andThen(g) 中,f 的输出必须能当 g 的输入
- 业务出错?比如把校验写在 andThen 里,等于查完用户才校验——数据已暴露。应优先用 compose 把校验塞到前面
- 混用容易混乱:一条流水线里不要 andThen 和 compose 交替用,统一视角更易维护
怎么选更顺手
看函数角色,而不是硬记“正反向”。
- 你在封装一个通用校验器、脱敏器、格式预处理器?用 compose,把它作为前置插件
- 你在组装一条从原始字符串到最终 DTO 的加工链?用 andThen,一步步推进
- 不确定时,写出等价表达式验证:f.andThen(g) ⇔ g.compose(f),选读起来像业务描述的那个
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










