Kotlin笔记16-高阶函数
10.1 高阶函数
- 定义高阶函数
序号 | Tips |
1 | 接受Lambda参数的函数称为具有函数式编程风格的API |
2 | 借助高阶函数定义自己的函数式API |
定义 | 如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,那么该函数称为高阶函数 |
新概念 | 函数类型 |
作用 | 高阶函数允许让函数类型的参数决定函数的执行逻辑 |
函数类型的基本语法规则:
(String, Int) -> Unit
->左边 | ->右边 |
声明函数接收的参数 | 声明返回值类型 |
参数之间 , 逗号隔开 | 无返回值就使用Unit=void(Java) |
将上述函数添加到参数声明或返回值上,那么他就是高阶函数:
fun example(func: (String, Int) -> Unit) {
func("hello", 123)
}
Example:
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=100
val num2=80
val result1= num1AndNum2(num1,num2,::plus)
val result2= num1AndNum2(num1,num2,::minus)
println("result1 is $result1")
println("result2 is $result2")
}
结果:
Kotlin支持Lambda表达式,匿名函数,成员引用来调用高阶函数
用法1-lambda表达式:
val result1 = num1AndNum2(num1, num2) { n1, n2 ->
n1 + n2
}
val result2 = num1AndNum2(num1, num2) { n1, n2 ->
n1 - n2
}
小试牛刀
仿apply:
fun StringBuilder.build(block: StringBuilder.() -> Unit): StringBuilder {
block()
return this
}
- 给StringBuilder定义了一个build扩展函数,接受函数类型参数,返回值也是StringBuilder
- 调用build函数时传入Lambda表达式自动拥有Stringbuilder的上下文,同时拥有apply的实现方式
apply实现Example:
fun eatFruits() {
val list= listOf("Apple","Banana","Orange","Orange","Pear","Grape")
val result=StringBuilder().apply {
append("Start eating fruits.\n")
for (fruit in list){
append("$fruit ")
}
append("\nAte all fruits.")
}
println(result.toString())
}
apply实现Example:
fun eatFruits1(){
val list= listOf("Apple","Banana","Orange","Orange","Pear","Grape")
val result=StringBuilder().build {
append("Start eating fruits.\n")
for (fruit in list){
append("$fruit ")
}
append("\nAte all fruits.")
}
println(result.toString())
}