一、定义与核心概念
-
高阶函数定义
高阶函数是指接收函数作为参数或返回函数的函数。例如,标准库中的run、apply、map均接收 Lambda 表达式作为参数,具备函数式编程特性。简单的说:函数中有lambda就是属于高阶函数, 函数的函数就是高阶函数
-
函数类型
Kotlin 通过函数类型支持高阶函数,语法为(参数类型列表) -> 返回类型。例如:val sum: (Int, Int) -> Int = { x, y -> x + y } // 函数类型声明若 Lambda 参数只有一个,可省略参数名,通过
it隐式引用。
二、常见高阶函数示例
-
集合操作
-
**
filter系列**:过滤集合元素(如filter、filterNot、filterIndexed)4。list.filter { it % 2 == 0 } // 筛选偶数 -
**
map**:转换集合元素,返回新集合5。list.map { it * 2 } // 元素翻倍 -
**
reduce**:将集合元素合并为单一结果(如求和、求积)5。list.reduce { acc, i -> acc + i } // 累加所有元素
-
-
作用域函数
如let、apply、run等,通过接收 Lambda 简化代码:val result = "Hello".let { it.length } // 返回字符串长度:ml- citation{ref="6,8" data="citationList"}
三、自定义高阶函数
-
接收函数参数
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) //接口声明
-
返回函数
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 表达式,显著提升代码简洁性与表达力。开发者可灵活运用标准库函数(如 map、filter)或自定义高阶函数,简化集合操作、异步处理等场景14。理解函数类型与 Lambda 的隐式规则(如 it、隐式返回)是掌握高阶函数的关键