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())
}                
                










