package chapter2.demo5 object DemoCurrying { def main(args: Array[String]): Unit = { def add(x: Int, y: Int): Int = x + y println(add(2, 3)) def addTaowa(x: Int): Int => Int = { def add(y: Int): Int = x + y add } println(addTaowa(2)(3)) def addTaowa2(x: Int): Int => Int = { (y: Int) => x + y } println(addTaowa2(2)(3)) // def add(x: Int, y: Int): Int = x + y def addCurrying(x: Int)(y: Int): Int = { x + y } val addLambda = (x:Int,y:Int) => x+y // add是普通函数,可以通过scala自带的curried方法转成一个柯里化函数 val curriedAdd = addLambda.curried addLambda(1,2) curriedAdd(1)(2) println(addCurrying(2)(3)) val add2 = addCurrying(2) _ add2(3) add2(4) // 柯里化的使用场景 // 柯里化可以部分记住参数的固定值 // debug info warn error def log(level: String)(message: String): Unit = { println(s"[$level] - $message") } log("info")("这是一条info级别的日志") log("warn")("这是一条warn级别的日志") log("error")("这是一条error级别的日志") val infoLog = log("info") _ val warnLog = log("warn") _ val errorLog = log("error") _ // 闭包 infoLog("普通日志") warnLog("告警日志") errorLog("错误日志") } }