Scala高阶函数

高阶函数(high-order function) 及 函数柯里化

能够接收函数作为参数的函数,叫做高阶函数(high-order function)

可以使应用程序更加健壮

1
2
3
4
5
6
7
8
9
def highFunc(f: Double => Double, num: Double): Unit = {
f(num)
}

def sum(num: Double): Double = {
num + num
}

highFunc(sum,6.0)

高阶函数可以接收多个函数作为参数

高阶函数可以返回一个函数

1
2
3
4
5
6
7
def minusxy(x: Int) = {
// 匿名函数
(y: Int) => x - y
}

// 输出结果是 8 - 5 = 3
println(minusxy(8)(5))

说明:

  1. minusxy 是高阶函数,返回了一个匿名函数
  2. 返回的匿名函数 (y: Int) => x - y
  3. 返回的匿名函数可以使用变量接收

闭包(closure)

闭包就是一个函数和与其相关的引用环境组合的一个整体

1
2
3
4
5
def minusxy(x: Int) = (y: Int) => x - y

val closureFunc: Int => Int = minusxy(20)
println(closureFunc(5)) // 15
println(closureFunc(10)) // 20
  1. (y: Int) => x - y返回的是一个匿名函数,因为该函数引用到了函数外的 x ,那么该函数和 x 整体形成了一个闭包
  2. 用对象的方式理解的话,返回的函数是一个对象,而 x 是该对象的一个字段,它们共同形成了一个闭包
  3. 当多次调用闭包时,使用的 x 其实是同一个,所以 x 不变
  4. 在使用闭包时,主要看返回函数引用了哪些函数外的变量,因为它们会组合成一个整体,从而形成一个闭包

函数柯里化(curry)

  1. 在函数编程中,接收多个参数的函数都可以转化为接收单个参数的函数,这个转化过程就叫做柯里化
  2. 柯里化就是证明了函数只需要一个参数而已
  3. 柯里化就是以函数为主体这种思想发展的必然结果
1
2
3
def minusxy(x: Int) = (y: Int) => x - y

println(minusxy(8)(5)) // 3

抽象控制

  1. 参数是函数
  2. 函数参数没有输入也没有返回值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def runInThread(func: => Unit): Thread = {
    new Thread {
    override def run(): Unit = {
    func
    }
    }
    }

    runInThread {
    println("线程启动")
    }