compose与andThen用于串联单职责函数构建加工流水线:compose按g→f顺序执行(f(g(x))),andThen按f→g顺序执行(g(f(x))),需分阶段组装、确保原子性、纯函数及显式空值处理。

用 compose 和 andThen 构建变量加工流水线,本质是把多个单步转换函数按需串联,让数据“流”过每一道处理环节。关键不在于堆砌功能,而在于明确每一步只做一件事、输入输出清晰、顺序可控。
理解 compose 与 andThen 的执行方向
两者都用于组合两个 Function<t r></t>,但调用顺序相反:
-
f.compose(g):先执行g,再把结果传给f→ 相当于数学上的f(g(x)) -
f.andThen(g):先执行f,再把结果传给g→ 相当于g(f(x))
举例:
FunctionFunction
times2.compose(squared).apply(3) → 先算 3²=9,再 9×2=18
times2.andThen(squared).apply(3) → 先算 3×2=6,再 6²=36
设计可复用的原子函数
流水线健壮的前提,是每个环节足够小、无副作用、类型一致。比如处理用户昵称:
-
trim: String → String(去首尾空格) -
normalizeCase: String → String(转小写) -
replaceEmoji: String → String(表情替换为 [EMOJI]) -
validateLength: String → String or null(长度校验,不通过返回 null)
注意:Java 的 Function 不支持自动短路(如遇到 null 就停)。若需中断,需在函数内部显式判断并返回 null,后续环节自行检查输入是否为 null。
分阶段组装流水线
不要一次性连到底。按业务语义分组,再逐层组合:
- 预处理组:
preprocess = trim.andThen(normalizeCase).andThen(replaceEmoji) - 校验组:
validated = preprocess.andThen(validateLength) - 后处理组(如加前缀):
enriched = validated.andThen(s -> "USR_" + s)
这样既便于单元测试各环节,也方便在不同场景中复用子流水线(比如只用 preprocess 而跳过校验)。
处理多参数或上下文依赖
Function 只接受一个入参,遇到需要额外配置(如脱敏规则、格式模板)时,用闭包固化参数:
- 用
lambda封装:(String s) -> s.replace("138", "138****") - 或提前构造函数实例:
Function<string string> maskPhone = buildMasker("^(\d{3})\d{4}(\d{4})$", "$1****$2")</string>
避免在函数体内读取全局变量或配置文件——那会破坏纯函数特性,导致流水线行为不可预测。

















