【2023】Kotlin教程
第二篇 面向对象与函数式编程
第13章 函数式编程基石——高阶函数和Lambda表达式
函数式编程思想虽然与面向对象一样立即悠久,但是支持函数式编程的计算机语言不过是近几年的事情。这些语言有Swift、Python、Java 8和C++ 11等,作为新生的语言Kotlin也支持函数式编程。
13.2 高阶函数
函数式编程的关键是高阶函数的支持。一个函数可以作为另一个函数的参数,或者返回值,那么这个函数就是“高阶函数”。
13.2.2 函数字面量
函数类型可以声明的变量,那么函数类型变量能够接收什么的数据呢?即函数字面量如何表示的问题,函数字面量可以有三种表示:
- 函数引用。引用到一个已经定义好的,有名字的函数。它可以作为函数字面量。
- 匿名函数。没有名字的函数,即匿名函数,它也可以作为函数字面量。
- Lambda:表达式。Lambda表达式是一种匿名函数,可以作为函数字面量。
举个栗子:
fun calculate(opr: Char): (Int, Int) -> Int {
// 加法函数
fun add(a: Int, b: Int): Int {
return a + b
}
// 减法函数
fun sub(a: Int, b: Int): Int {
return a - b
}
val result: (Int, Int) -> (Int) =
when (opr) {
'+' -> ::add
'-' -> ::sub
'*' -> {
// 乘法匿名函数
fun(a: Int, b: Int): Int {
return (a * b)
}
}
else -> {
a, b -> (a / b) } // 触发Lambda 表达式
}
return result
}
fun main() {
val f1 = calculate('+')
val f2 = calculate('-')
val f3 = calculate('*')
val f4 = calculate('/')
println(f1(10, 5))
println(f2(10, 5))
println(f3(10, 5))
println(f4(10, 5))
}
这段代码中,'+' -> ::add
和 '-' -> ::sub
是函数引用,
上述代码 '+' -> ::add
和 '-' -> ::sub
是函数引用, 采用“双冒号加函数名”形式引用,add和sub是两个局
部函数,它们的函数引用表示方式是:add和:sub,它们可以作为函数字面量赋值给result变量。
代码fun(a: Int, b: Int): Int { return (a * b) }
声明匿名函数,匿名函数不需要函数名,它是一个表达式直接赋值给result变量。
代码{ a, b -> (a / b) }
采用的Lambda表达式,也可以赋值给result变量。
获得一个函数类型的变量之后如何使用呢?答案是可以把它当作函数一样调用。