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. 函数引用 :: 可快速传递已有方法。

相关推荐
andyweike3 小时前
Android Automotive
android
又见情义3 小时前
记一次 RK3568 Android 13 蓝牙反复重启问题的排查与修复
android
hai_android4 小时前
Kotlin Flow combine 源码剖析:一个 Channel 如何优雅合并多条流
android·java·kotlin
敲代码的瓦龙5 小时前
Jetpack?ViewModel!!!
android·开发语言·kotlin·android-studio
Godikov6 小时前
Android 工控终端实战:从秒级卡顿到毫秒响应,SQLite/LitePal 性能优化全记录
android
星间都市山脉7 小时前
Android16 SystemService.onBootPhase 调用时机
android·java·linux·windows·ubuntu
swithun7 小时前
不用 WebView,我用 Kotlin + Compose Multiplatform 重写 Mermaid,并做了 2048 组对拍
android·开源·kotlin
AI吃大瓜8 小时前
人脸检测和行人检测4:Android实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码,可实时检测)
android·yolo·人脸检测·人体检测·行人检测·yolo26
与海boy8 小时前
Prompt模版
android·prompt
FlightYe8 小时前
音视频修炼之编码器(一):AVC、HEVC编码器内部
android·linux·c++·音视频