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 小时前
Day03_HTML 列表、表格、表单完整指南(下)
android·javascript·html
QING6182 小时前
Kotlin之【init】—— 新手须知
android·kotlin·android jetpack
阿巴斯甜2 小时前
MMKV 和DataStore 的区别:
android
阿巴斯甜2 小时前
MVVM和MVI的区别:
android
Fate_I_C2 小时前
Android Navigation Fragment 导航实战
android·kotlin·navigation
Fate_I_C3 小时前
Adroid Data Binding数据绑定对比(findViewXX、ButterKnife)
android·kotlin·databinding
黑心的奥利奥3 小时前
WeeX跨平台框架,自定义安卓平台MarkDown文本渲染组件高度跟随内容自适应实现思路探索
android
KIHU快狐4 小时前
快狐KIHU|110寸壁挂触控一体机G+G电容屏安卓系统汽车展厅查询展示
android·python·汽车
Fate_I_C5 小时前
Android DataBinding数据绑定表达式、双向绑定
android·kotlin·databinding