Scala函数组合怎么实现
在写代码的时候,经常会遇到需要把多个小功能拼接起来完成一个复杂操作的场景。比如处理用户输入时,先去空格、再转小写、最后校验格式。如果每个步骤都单独调用,代码会显得啰嗦又难维护。Scala 提供了函数组合的能力,让这些操作可以像流水线一样串起来。
Scala 中函数是一等公民,这意味着函数可以作为参数传递,也可以作为返回值。基于这个特性,函数组合变得非常自然。常用的两个方法是 compose 和 andThen。
使用 andThen 进行顺序组合
andThen 表示“先执行当前函数,再执行另一个函数”。比如有这样一个需求:先把数字加 10,然后再乘以 2。
val addTen = (x: Int) => x + 10
val multiplyByTwo = (x: Int) => x * 2
val process = addTen andThen multiplyByTwo
println(process(5)) // 输出 30,因为 (5 + 10) * 2 = 30这里的 process 就是一个组合后的函数,调用起来和普通函数没区别。
使用 compose 实现反向组合
compose 和 andThen 刚好相反,它表示“先执行传入的函数,再执行自己”。还是上面的例子,换一种写法:
val process2 = multiplyByTwo compose addTen
println(process2(5)) // 同样输出 30,因为先加 10 再乘 2注意顺序:f compose g 相当于数学上的 f(g(x)),g 先执行。
实际应用场景
假设你在做一个文本处理工具,需要对一段用户输入做清洗:去除首尾空格、转为小写、替换敏感词。可以这样组织代码:
val trim = (s: String) => s.trim
val toLowerCase = (s: String) => s.toLowerCase
val censor = (s: String) => s.replace("bad", "***")
val cleanText = trim andThen toLowerCase andThen censor
println(cleanText(" This is a BAD example ")) // 输出 "this is a *** example"每一步都很清晰,组合后的函数也容易复用。如果以后要增加“去除标点”的步骤,只需要再拼一个函数进去。
函数组合不仅让代码更简洁,还提升了可读性。尤其是面对一连串转换逻辑时,用 andThen 或 compose 能让流程一目了然,比嵌套调用强多了。