所谓高阶函数,就是参数或者返回值是函数的函数。在python
里也称为偏函数。
刚好看到kotlin
的高阶函数部分,就记录一下。
示例代码很少,先放代码:
package com.example.code
import kotlin.math.pow
val add = { a: Int, b: Int -> a + b }
val del = { a: Int, b: Int -> a - b }
val mul = { a: Int, b: Int -> a * b }
val div = { a: Int, b: Int -> a / b }
fun inc(x: Int, y: Int) = x + y + 1
fun operate(n: Int, m: Int, op: (Int, Int) -> Int) = op(n, m)
fun returnOp(from: String = ""): (Int, Int) -> Int {
return when (from) {
"add" -> add
"del" -> del
"mul" -> { x, y -> x * y }
"div" -> { x, y -> x / y }
else -> { x: Int, y: Int -> x.toDouble().pow(y.toDouble()).toInt() }
}
}
fun main() {
println(operate(1, 2, add))
println(operate(1, 2, del))
println(operate(1, 2, mul))
println(operate(1, 2, div))
println(operate(1, 2, ::inc))
println("HIGH: ${returnOp("add")(3, 4)}")
println("HIGH: ${returnOp("-")(3, 4)}")
}
这里分别定义了两种简单的高阶函数,第一种是参数是函数的函数;第二种是返回值是函数的函数。
- 第一种对应的示例代码就是
fun operate(n: Int, m: Int, op: (Int, Int) -> Int) = op(n, m)
; - 第二种对应的示例代码就是
fun returnOp(from: String = ""): (Int, Int) -> Int {...}
;
至于上面的add/del/div/mul
在kotlin
里面叫lambda
表达式。不过这个并不是高阶函数,只是lambda
表达式。(lambda
表达式约等于匿名函数,不一定就是高阶函数。)
所谓lambda
表达式,就是”A lambda is an expression that makes a function.“
上面说的声明,高阶函数的声明,下面看一下高阶函数的调用:
-
println(operate(1, 2, div))
这个很简单,理解起来也不会有任何的障碍。这种参数是函数类型的高阶函数,调用起来和普通函数差别不大,几乎没有差别。 -
println("HIGH: ${returnOp("add")(3, 4)}")
这种返回值类型是函数类型的高阶函数的调用,看起来有点碍眼了。因为它的形式是symbol(xx)(yy)
.后面有两个括号了。
但是还是比较好理解的,因为第一个括号是为了得到这个返回值,跟普通函数是一样的。然后第二个括号是因为这个返回值它是个函数,然后既然是个函数,那就能调用,那调用这个函数就得有括号,即使是无参函数。
当然,如果第二种调用分两步去写,就更容易理解一点了。
val delete = returnOp("del")
println("HIGH: ${delete(3, 4)}")
得益于kotlin 是静态类型的语言,所以其高阶函数的调用写起来很容易,ide 的提示功能很强大。
OK,以上是kotlin
中高阶函数的尝鲜。