什么是高阶函数?
如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数的话,那么该函数就被称为高阶函数。
这个定义可能有点不太好理解,一个函数怎么能接受另一个函数作为参数呢?这里需要设计到另一个概念了:函数类型。我们都知道,编程语言中有整型、布尔型等等字段类型,而Kotlin又增加了一个函数类型的概念。如果我们将这种函数类型添加到一个函数参数声明或者返回值声明当中的话,那么这就是一个高阶函数了。
简言之:高阶函数是将函数用作参数或返回值的函数。
lambda表达式结构
{参数名1: 参数类型, 参数名2: 类型类型, ...... -> 函数体}
这是Lambda表达式最完整的语法结构定义。首先最外层是一对大括号,如果有参数传入到Lambda表达式中的haul,我们还需要声明参数列表,参数列表的结尾使用一个 -> 符号,表示参数列表的结束和函数体的开始,函数体可以编写任何代码(不建议太长),并且最后一行代码会自动作为Lambda表达式的返回值。
实例:
写法一,第三个参数传入函数名,方法名引用的方式向一个函数里传入一个函数类型的参数。缺点,函数名传参,还得去定义一个该函数名的方法,然后把它的名字传进去
fun main() {
val num1 = 10
val num2 = 20
val result1 = num1AndNum2(num1, num2, ::plus)
val result2 = num1AndNum2(num1, num2, ::minus)
println(result1)//30
println(result2)//-10
}
/**
* 第三个参数传入一个函数,用来接收第一个和第二个参数,处理的方式由传入的函数决定
*/
fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int {
return operation(num1, num2)
}
fun plus(num1: Int, num2: Int): Int {
return num1 + num2
}
fun minus(num1: Int, num2: Int): Int {
return num1 - num2
}
写法二,第三个参数使用"匿名函数"的方式
fun main() {
val num1 = 10
val num2 = 20
val result1 = num1AndNum2(num1, num2, fun (num1: Int, num2: Int): Int {
return num1 + num2
})
val result2 = num1AndNum2(num1, num2, fun (num1: Int, num2: Int): Int {
return num1 - num2
})
println(result1)
println(result2)
}
/**
* 第三个参数传入一个函数,用来接收第一个和第二个参数,处理的方式由传入的函数决定
*/
fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int {
return operation(num1, num2)
}
写法三,第三个参数传入lambda表达式。当lambda表达式作为方法的最后一个参数时,它可以移到括号的外面
fun main() {
val num1 = 10
val num2 = 20
val result1 = num1AndNum2(num1, num2){ a, b -> a + b }
val result2 = num1AndNum2(num1, num2){ a, b -> a - b }
println(result1)
println(result2)
}
/**
* 第三个参数传入一个函数,用来接收第一个和第二个参数,处理的方式由传入的函数决定
*/
fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int {
return operation(num1, num2)
}