一、核心定义
1. 什么是高阶函数(Higher-order Function)
满足任意一条就是高阶函数:
- 参数是函数
- 返回值是函数
- 同时满足 1 + 2
普通函数:参数 / 返回值 只能是 基本类型、对象高阶函数:函数可以当做参数 / 返回值传递
2. 为什么要用高阶函数
- 简化回调、消除
interface匿名内部类 - 链式调用、逻辑解耦、代码极简
- 配合 Lambda、作用域函数、集合流式操作
- 实现函数式编程思想
二、Kotlin 函数类型语法(必懂)
1. 函数类型格式
kotlin
rust
// 无参、无返回
() -> Unit
// 单个参数、无返回
(Int) -> Unit
// 多个参数、有返回
(Int, String) -> Boolean
// 可空函数类型
(() -> String)?
2. 举例
kotlin
rust
// 定义一个「接收Int,返回String」的函数变量
val func: (Int) -> String = { num -> num.toString() }
三、第一种:参数为函数(最常用)
1. 基础示例
kotlin
kotlin
// 高阶函数:第二个参数是 函数类型
fun calc(a: Int, b: Int, block: (Int, Int) -> Int): Int {
return block(a, b)
}
调用:
kotlin
javascript
// 正常调用
val res1 = calc(10, 20) { x, y -> x + y }
val res2 = calc(10, 20) { x, y -> x * y }
2. 无参函数、回调场景
kotlin
kotlin
fun showLog(block: () -> Unit) {
println("开始")
block()
println("结束")
}
// 使用
showLog {
println("中间业务逻辑")
}
四、第二种:返回值为函数
kotlin
kotlin
// 高阶函数:返回一个函数
fun getOp(): (Int) -> Int {
return { it * 2 }
}
// 使用
val op = getOp()
println(op(10)) // 20
五、Lambda 简化规则(写高阶函数必备)
- 如果最后一个参数是函数 ,可以写到括号外面 :尾 Lambda
- 如果 Lambda 只有一个参数,可用
it省略参数 - 单行 Lambda 自动作为返回值,不用
return
注意:Kotlin的高阶函数,不需要转成Stream,也不需要collect(Collectors.toList())结尾;
示例:
kotlin
scss
// 原始
listOf(1,2,3).filter({ num -> num > 1 })
// 简化1:尾Lambda
listOf(1,2,3).filter { num -> num > 1 }
// 简化2:it省略参数
listOf(1,2,3).filter { it > 1 }
六、Kotlin 内置高频高阶函数(项目天天用)
1. 集合系列(流式操作)
filter过滤map转换forEach遍历flatMap扁平化reduce聚合sortedBy排序
kotlin
scss
val list = listOf(1,2,3,4)
// 全部都是高阶函数
list.filter { it % 2 == 0 }
.map { it * 10 }
.forEach { println(it) }
2. 五大 作用域高阶函数(重点)
let / run / apply / also / with全部都是高阶函数,用来简化对象作用域、空安全、初始化。
表格
| 函数 | 上下文 | 返回值 | 适用场景 |
|---|---|---|---|
| let | it | 最后一行 | 空安全、变量临时作用域 |
| run | this | 最后一行 | 逻辑块 + 返回结果 |
| apply | this | 对象本身 | 对象初始化 |
| also | it | 对象本身 | 额外附加操作 |
| with | this | 最后一行 | 统一省略对象调用 |
示例:
kotlin
rust
val str: String? = "kotlin"
// 空安全 经典let
str?.let {
println(it.length)
}
// apply 初始化对象
val user = User().apply {
name = "张三"
age = 20
}
七、匿名函数 / 函数引用
1. 匿名函数
kotlin
kotlin
val fun1 = fun(a: Int): Int {
return a + 1
}
2. 方法引用 ::(高阶函数传参极简写法)
kotlin
kotlin
fun test(num: Int) = println(num)
// 函数引用,直接传入方法
listOf(1,2,3).forEach(::test)
八、内联函数 inline /noinline/crossinline(高阶函数性能重点)
1. 高阶函数缺点
每次传 Lambda 都会创建匿名类对象 ,频繁调用会有性能开销
2. 解决:inline 内联函数
- 编译时直接把 Lambda 代码复制到调用处
- 不创建额外对象,性能大幅提升
- 项目中自定义高阶函数建议全部加 inline
kotlin
kotlin
inline fun doWork(block: ()->Unit) {
block()
}
noinline:局部不内联crossinline:禁止非局部 return
九、高阶函数 与 Java 对比(好理解)
Java 想要实现回调:
java
运行
csharp
interface OnClick{
void click();
}
void setOnClick(OnClick click){}
// 使用:new 匿名内部类
Kotlin 高阶函数:
kotlin
kotlin
fun setOnClick(block:()->Unit)
// 直接 lambda,无接口、无匿名类
setOnClick{ }
Kotlin 高阶函数 = 自动帮你省略 Java 回调接口
十、return 陷阱:Lambda 与 高阶函数
- Lambda 里直接 return → 退出外层函数
- 想要只退出当前 Lambda → 标签返回
kotlin
kotlin
list.forEach lit@{
if(it == 2) return@lit
}
十一、面试极简背诵版
- 高阶函数:参数或返回值是 函数类型 的函数。
- 核心价值:简化回调、函数式编程、集合流式、作用域函数。
- 尾 Lambda:最后一个函数参数可写在括号外,代码更简洁。
- 常用:集合操作符 +
let/run/apply/also/with五大作用域高阶函数。 - 性能优化:自定义高阶函数尽量加 inline,减少 Lambda 对象创建。
- 函数引用
::可快速传递已有方法。