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

相关推荐
应用市场2 小时前
eMMC 与 UFS 存储原理及在 Android 中的应用
android
随遇丿而安2 小时前
第4周:ImageView 最怕的不是不会显示图片,而是显示得“不对劲”
android
Mart!nHu2 小时前
Android10 添加以太网网络共享功能
android·以太网共享
修炼者5 小时前
bitmap和drawable的互相转换
android
美狐美颜SDK开放平台5 小时前
美颜SDK接入流程详解:Android、iOS、鸿蒙兼容方案解析
android·人工智能·ios·华为·harmonyos·美颜sdk·视频美颜sdk
笔夏7 小时前
【安卓学习之FloatingActionButton】按钮太小
android·学习
XD7429716367 小时前
科技早报晚报|2026年5月15日:无摄像头空间感知、Android 设备实验室与视频检索代理,今天更值得跟进的 3 个技术机会
android·科技·音视频·开源项目·边缘ai·开发者工具
应用市场7 小时前
Android Verified Boot 2.0 安全启动原理详解
android·安全
只可远观7 小时前
Android XML命令式和Jetpack Compose声明式UI
android·xml
他是龙5518 小时前
DVWA 靶场深度解析:文件包含 & 文件上传(Low → Impossible)
android