1、偏应用函数
偏应用函数就是一个表达式,可以在调用函数时, 只需要提供部分参数 或者 不需要提供参数。
下面展示了普通函数log 和 偏应用函数 logWithDateBound,本质上都是通过 log来实现的:
object Test {
def main(args: Array[String]) {
val date = new java.util.Date
log(date,"---普通函数输出---")
log(date,"INFO 1: xxx")
Thread.sleep(1000)
log(date,"INFO 2: xxx")
Thread.sleep(1000)
log(date,"INFO 3: xxx")
Thread.sleep(1000)
//偏应用函数,就是一个表达式
val logWithDateBound = log( date, _ : String )
logWithDateBound("---偏应用函数输出---")
logWithDateBound("INFO 4: xxx")
Thread.sleep(1000)
logWithDateBound("INFO 5: xxx")
Thread.sleep(1000)
logWithDateBound("INFO 6: xxx")
Thread.sleep(1000)
}
def log(date: java.util.Date, message: String) {
println( date + "------" + message )
}
}
输出:
C:\Users\Administrator\Desktop>scala Test.scala
Mon Sep 23 13:34:18 CST 2019---------普通函数输出---
Mon Sep 23 13:34:18 CST 2019------INFO 1: xxx
Mon Sep 23 13:34:18 CST 2019------INFO 2: xxx
Mon Sep 23 13:34:18 CST 2019------INFO 3: xxx
Mon Sep 23 13:34:18 CST 2019---------偏应用函数输出---
Mon Sep 23 13:34:18 CST 2019------INFO 4: xxx
Mon Sep 23 13:34:18 CST 2019------INFO 5: xxx
Mon Sep 23 13:34:18 CST 2019------INFO 6: xxx
2、函数柯里化
函数的柯里化 就是把原来接受2个参数的函数,变成接受1个参数的函数 的过程。
新的函数 返回一个以第2个参数 做为参数的函数。
比如,普通函数定义:def add(x: Int, y: Int) = x + y ,调用 add(1,2) 的结果为 3
而柯里化后的定义:def add(x:Int) (y: Int) => x + y ,调用 add(1)(2) 的结果也是3,过程是 第1次调用使用1个参数x,然后返回一个函数类型的值,第2次使用参数y 调用这个函数类型的值,最后返回结果。
这个柯里化的过程可以演变为:def add(x:Int) = (y: Int) => x + y ,也就是接收1个参数 x,返回一个匿名函数,这个匿名函数接收1个Int类型参数y,函数体为 x + y。
object Test {
def main(args: Array[String]) {
println( addInt(1)(2) )
}
def addInt(x:Int)(y: Int): Int = x + y
}
输出为 3