Kotlin 高阶函数:

一、核心定义

1. 什么是高阶函数(Higher-order Function)

满足任意一条就是高阶函数:

  1. 参数是函数
  2. 返回值是函数
  3. 同时满足 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 简化规则(写高阶函数必备)

  1. 如果最后一个参数是函数 ,可以写到括号外面 :尾 Lambda
  2. 如果 Lambda 只有一个参数,可用 it 省略参数
  3. 单行 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 与 高阶函数

  1. Lambda 里直接 return → 退出外层函数
  2. 想要只退出当前 Lambda → 标签返回

kotlin

kotlin 复制代码
list.forEach lit@{
    if(it == 2) return@lit
}

十一、面试极简背诵版

  1. 高阶函数:参数或返回值是 函数类型 的函数。
  2. 核心价值:简化回调、函数式编程、集合流式、作用域函数。
  3. 尾 Lambda:最后一个函数参数可写在括号外,代码更简洁。
  4. 常用:集合操作符 + let/run/apply/also/with 五大作用域高阶函数。
  5. 性能优化:自定义高阶函数尽量加 inline,减少 Lambda 对象创建。
  6. 函数引用 :: 可快速传递已有方法。

相关推荐
传奇开心果编程17 分钟前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程2 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程2 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程2 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓2 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程2 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer
supabc1233 小时前
Celium:连接 Windows、Mac、Linux 与 Android,让远程访问和设备管理更简单
android·linux·windows·macos·远程访问·网络管理·celium
Dovis(誓平步青云)3 小时前
导览音频切换太快,旧讲解不能覆盖新展品
android·前端·javascript·ecmascript·音视频·宠物
五彩小白20 小时前
自回归和上下文
android
事圆则缓1 天前
Android 多渠道打包实战:Product Flavors、签名、AAB 与发包校验
android