下面代码展示了 Scala 中的部分应用函数(Partially Applied Function) 特性
/*
*部分应用函数
*如果一个函数需要3个参数,而我们只给了2个参数,会怎么样?
*/
def getSum(a: Int, b: Int, c: Int): Int = {
a + b + c
}
def main(args: Array[String]): Unit = {
println(getSum(10, 20, 30))
val t = getSum(10, 20, _) // t 就是部分应用函数!
val t1 = getSum(_, 20, _) // t1 就是部分应用函数!
println(t(50))
println(t1(20, 50))
}
核心逻辑说明
-
getSum是一个需要 3 个 Int 参数的函数,返回它们的总和。 -
在
main方法中:- 直接调用
getSum(10, 20, 30)会返回60(10+20+30)。 val t = getSum(10, 20, _):只传入前 2 个参数(10 和 20),用_代替第 3 个参数,此时t就成为了一个部分应用函数(只需要 1 个参数即可调用)。val t1 = getSum(_, 20, _):传入中间参数 20,用_代替第 1 和第 3 个参数,此时t1也是部分应用函数(需要 2 个参数才能调用)。
- 直接调用
执行结果
t(50)等价于getSum(10, 20, 50),结果为80(10+20+50)。t1(20, 50)等价于getSum(20, 20, 50),结果为90(20+20+50)
结论
当函数需要 N 个参数,而我们只传入了 M 个(M < N),并用_代替剩余参数时,会得到一个部分应用函数。这个新函数会 “记住” 已传入的参数,后续只需补充剩余参数即可调用。
这种特性可以简化代码,尤其是在需要重复使用某个函数的固定参数场景时非常方便