【2023】Kotlin教程
文章目录
第二篇 面向对象与函数式编程
第13章 函数式编程基石——高阶函数和Lambda表达式
函数式编程思想虽然与面向对象一样立即悠久,但是支持函数式编程的计算机语言不过是近几年的事情。这些语言有Swift、Python、Java 8和C++ 11等,作为新生的语言Kotlin也支持函数式编程。
13.3 Lambda表达式
Lambda表达式是一种匿名函数,可以作为表达式、函数参数和函数返回值使用,Lambda表达式的运算结果是一个函数。
13.3.1 Lambda表达式标准语法格式
Kotlin中的Lambda表达式很灵活,其标准语法格式如下:
{
参数列表 ->
Lambda体
}
其中,Lambda表达式的参数列表与函数的参数列表形式类似,但是Lambda表达式参数列表前后没有小括号。箭头符号将参数列表与Lambda体分隔开,Lambda表达式不需要声明返回类型。
Lambda表达式可以有返回值,如果没有return语句Lambda体的最后一个表达式就是Lambda表达式的返回值,如果有return语句返回值是return语句后面的表达式。
【提示】Lambda表达式与函数、匿名函数一样都有函数类型,但从Lambda表达式的定义中只能看到参数类型,看不到返回类型声明,那是因为返回类型可以通过上下文推导出来。
举个栗子:
private fun calculate(opr: Char): (Int, Int) -> Int {
return when (opr) {
'+' -> {
a: Int, b: Int -> a + b }
'-' -> {
a: Int, b: Int -> a - b }
'*' -> {
a: Int, b: Int -> a * b }
else -> {
a: Int, b: Int -> a / b }
}
}
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))
}
calculate函数是高阶函数,它的返回值是函数类型(Int,Int)->Int。代码分别定义了4个Lambda表达式,它们的函数类型(Int,Int)->Int与calculate函数要求的返回类型是一致的。
当然我们还可以写成表达式函数体的形式:
private fun calculate(opr: Char): (Int, Int) -> Int = when (opr) {
'+' -> {
a: Int, b: Int -> a + b }
'-' -> {
a: Int, b: Int -> a - b }
'*' -> {
a: Int, b: Int -> a * b }
else -> {
a: Int, b: Int -> a / b }
}
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))
}
不难发现,表达式函数体要比代码块函数体代码简洁很多。