Kotlin 高阶函数

103 阅读2分钟

一、定义与核心概念

  1. 高阶函数定义
    高阶函数是指‌接收函数作为参数‌或‌返回函数‌的函数。例如,标准库中的 runapplymap 均接收 Lambda 表达式作为参数,具备函数式编程特性。

    简单的说:函数中有lambda就是属于高阶函数, 函数的函数就是高阶函数

  2. 函数类型
    Kotlin 通过函数类型支持高阶函数,语法为 (参数类型列表) -> 返回类型。例如:

    val sum: (Int, Int) -> Int = { x, y -> x + y } // 函数类型声明
    

    若 Lambda 参数只有一个,可省略参数名,通过 it 隐式引用。


二、常见高阶函数示例

  1. 集合操作

    • ‌**filter 系列**‌:过滤集合元素(如 filterfilterNotfilterIndexed)4。

      list.filter { it % 2 == 0 } // 筛选偶数
      
    • ‌**map**‌:转换集合元素,返回新集合5。

      list.map { it * 2 } // 元素翻倍
      
    • ‌**reduce**‌:将集合元素合并为单一结果(如求和、求积)5。

      list.reduce { acc, i -> acc + i } // 累加所有元素
      
  2. 作用域函数
    letapplyrun 等,通过接收 Lambda 简化代码:

    val result = "Hello".let { it.length } // 返回字符串长度:ml-  citation{ref="6,8" data="citationList"}
    

三、自定义高阶函数

  1. 接收函数参数

    fun processData(data: List<Int>, action: (Int) -> Unit) {
        data.forEach(action) // 对每个元素执行 action
    }
    

    调用示例:

    processData(list) { println(it) } // 打印每个元素:ml-citation{ref="2,7" data="citationList"}
    

    Lambda表达式看作接口定义,如何实现在调用时去具体实现

fun main(){
   var r:String = show01(99){   //接口实现
       "Str it:$it"
   }
   println(r)

  show02(1,2,3){n1,n2,n3 ->
       println(n1+n2+n3)
  }

   show02(1,2,3){n1,n2,n3 ->
       println(n1*n2*n3)
   }

   show02(1,2,3){n1,n2,n3 ->
       println(n1/n2/n3)
   }

}
//show01 返回的是什么类型,String 是因为 Lambda 是返回String
fun show01(number:Int,Lambda:(Int)-> String):String = Lambda.invoke(number) //接口声明

// 需求:三数相加,三数相乘、三数相除,由用户自己决定,我们只定义规则
fun show02(number1:Int,number2:Int,number3:Int,Lambda:(Int,Int,Int)-> Unit):Unit = Lambda.invoke(number1,number2,number3) //接口声明
  1. 返回函数

    fun createMultiplier(factor: Int): (Int) -> Int {
        return { x -> x * factor }
    }
    val double = createMultiplier(2) // 生成双倍函数:ml-citation{ref="2" data="citationList"}
    

四、Lambda 表达式特性

  • 隐式返回‌:Lambda 的最后一行为返回值(无需 return)。
  • 参数简化‌:单参数时可用 it 代替显式声明。
  • 与扩展函数结合‌:如 T.let 通过扩展函数接收 Lambda,操作对象自身8。

五、案例解析

需求:通过高阶函数实现登录功能

实现方式一

//通过高阶函数实现登录功能
fun main(){
    LoginEngin("haoran","123")
}
//高阶函数实现
fun LoginEngin(userName:String,userPwd:String){ 
    LoginService(userName,userPwd){name,pwd ->
        if (name =="haoran" && pwd =="123"){
            println("恭喜${name} 登录成功")
        }else {
            println("很遗憾${name} 登录失败")
        }
    }
}


//高阶函数规则,主意声明之后不要有==,直接在参数列表括号后增加大括号
fun LoginService(name:String,pwd:String,LoginCheck:(String,String)-> Unit) {

    if (name.isEmpty()||pwd.isEmpty()){
        return
    }

    if (name ==null || pwd == null ){
        return
    }
    LoginCheck(name,pwd)
}

实现方式二

fun main(){
    LoginEngin("haoran","123"){
        if (it) println("登录成功") else println("登录失败")   //这里的it 代表lambda表达式的输入
    }
}

fun LoginEngin(name:String,pwd:String,responseResult:(Boolean) ->Unit){  //接口定义 规则定义
    if (name =="haoran" && pwd =="123"){
        println("恭喜${name} 登录成功")
        responseResult(true)
    }else {
        println("很遗憾${name} 登录失败")
        responseResult(false)
    }
}

六、总结

高阶函数通过函数类型和 Lambda 表达式,显著提升代码简洁性与表达力。开发者可灵活运用标准库函数(如 mapfilter)或自定义高阶函数,简化集合操作、异步处理等场景14。理解函数类型与 Lambda 的隐式规则(如 it、隐式返回)是掌握高阶函数的关键