f.compose(g)表示g先执行、f后执行,等价于f(g(x)),符合数学复合函数(f∘g)(x)定义;而f.andthen(g)是f先执行、g后执行,等价于g(f(x))。

Function.compose 用于把两个函数“串起来”,让右边的函数先执行,结果传给左边的函数——也就是反向组合(右→左执行)。
compose 的执行顺序是:f.compose(g) 等价于 f(g(x))
也就是说:
- g 先运行,输入 x,输出中间结果
- f 再运行,接收 g 的输出作为输入,最终返回结果
- 这和数学中 (f ∘ g)(x) = f(g(x)) 的定义完全一致
和 andThen 的区别:compose 是反向,andThen 是正向
同样是组合 f 和 g:
-
f.compose(g)→ 先 g,后 f →f(g(x)) -
f.andThen(g)→ 先 f,后 g →g(f(x))
记法小技巧:compose 的“com-”像“combine from right”,andThen 直观表示“f 执行完,然后执行 g”。
实际用法示例:字符串处理链
比如想把数字转成字符串、再转大写、再加前缀:
Function<integer string> intToStr = i -> String.valueOf(i); Function<string string> toUpper = s -> s.toUpperCase(); Function<string string> addPrefix = s -> "ID: " + s; // 想实现:ID: 123 → 即:addPrefix(toUpper(intToStr(123))) Function<integer string> pipeline = addPrefix.compose(toUpper).compose(intToStr); System.out.println(pipeline.apply(123)); // 输出:ID: 123 </integer></string></string></integer>
注意链式调用顺序:从右往左读更清晰 —— intToStr → toUpper → addPrefix。
注意事项
- 所有 compose 调用必须保证类型匹配:g 的返回类型 == f 的参数类型
- compose 是不可变操作,每次调用都返回新 Function,原函数不受影响
- 如果中间函数可能为 null,compose 会直接抛
NullPointerException,建议提前校验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











