详解Kotlin 高阶函数 与 Lambda 表达式
发布时间 - 2026-01-11 02:07:55 点击率:次详解Kotlin 高阶函数 与 Lambda 表达式

高阶函数(higher-order function)是一种特殊的函数, 它接受函数作为参数, 或者返回一个函数. 这种函数的一个很好的例子就是 lock() 函数, 它的参数是一个锁对象(lock object), 以及另一个函数, 它首先获取锁, 运行对象函数, 然后再释放锁:
fun <T> lock(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
}finally {
lock.unlock()
}
}
上面的代码: body 参数是一个 函数类型: () -> T , 因此它应该是一个函数, 这个函数没有参数, 返回一个 T 类型的值。
高阶函数类似 C 语言的函数指针,高阶函数另一个例子:
fun <T, R> List<T>.map(transform: (T) -> R): List<R> {
val result = arrayListOf<R>()
for (item in this)
result.add(transform(item))
return result
}
val doubled = ints.map { it -> it * 2 } // 调用
函数类型(Function Type)
对于接受另一个函数作为自己参数的函数, 我们必须针对这个参数指定一个函数类型, 例如前面例子的 map 函数,参数 transform 的类型是 (T) -> R, 意思是它是一个函数,参数 T, 返回 R。
引用以及返回一个函数
高阶函数可以接受函数参数,也可以返回一个函数引用, 函数可以赋值给变量,和 C 语言的函数指针一样。
fun bar(): (String) -> String = { str -> str.reversed() }
val reversi = bar()
reversi("hello")
reversi("world")
内联函数(Inline Function)
Kotlin 支持内联函数,函数内联也许会导致编译产生的代码尺寸变大, 但如果我们使用合理(不要内联太大的函数), 可以换来性能的提高。
inline fun foo() {
//
}
如果一个内联函数的参数中有多个 Lambda 表达式, 而你只希望内联其中的一部分, 你可以对函数的一部分参数添加 noinline 标记。
inline fun foo(inlined: () -> Unit, noinline notInlined: () -> Unit) {
// ...
}
Lambda 表达式
Lambda 表达式的完整语法形式,如:
val sum = { x: Int, y: Int -> x + y }
Lambda 表达式包含在大括号之内, 在完整语法形式中, 参数声明在圆括号之内, 参数类型的声明可选, 函数体在 -> 符号之后. 如果 Lambda 表达式自动推断的返回值类型不是 Unit , 那么 Lambda 表达式函数体中, 最后一条(或者就是唯一一条)表达式的值, 会被当作整个 Lambda 表达式的返回值。
很多情况下 Lambda 表达式只有唯一一个参数. 如果 Kotlin 能够自行判断出 Lambda 表达式的参数定义,那么它将允许我们省略唯一一个参数的定义, 并且会为我们隐含地定义这个参数, 使用的参数名为 it :
ints.filter { it > 0 }
使用 带标签限定的 return 语法, 我们可以在 Lambda 表达式内明确地返回一个结果值. 否则, 会隐含地返回 Lambda 表达式内最后一条表达式的值。
ints.filter {
val shouldFilter = it > 0
return@filter shouldFilter
}
匿名函数(Anonymous Function)
匿名函数看起来与通常的函数声明很类似, 区别在于省略了函数名。
fun(x: Int, y: Int): Int = x + y
参数和返回值类型的声明与通常的函数一样, 但如果参数类型可以通过上下文推断得到, 那么类型声明可以省略:
ints.filter(fun(item) = item > 0)
闭包
所谓闭包,就是一个代码块可以访问外层作用域的变量和参数,例如上面提到的 Lambda 表达式和匿名函数。
var containsNegative = false
val ints = listOf(0, 1, 2, 3, 4, 5)
ints.forEach {
if (it < 0)
containsNegative = true
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Kotlin
# 高阶函数
# 与
# Lambda
# 表达式
# Kotlin 使用Lambda来设置回调的操作
# kotlin实战教程之lambda编程
# Kotlin基础学习之lambda中return语句详解
# 玩转Kotlin 彻底弄懂Lambda和高阶函数
# java协程框架quasar和kotlin中的协程对比分析
# Kotlin与Java的区别详解
# Kotlin 和 Java 混合开发入门教程
# Java与kotlin详细对比
# Java 和 Kotlin Lambda 表达式示例详解
# 高阶
# 一个函数
# 是一个
# 返回值
# 唯一一
# 之内
# 很好
# 是一种
# 多个
# 中有
# 它是
# 我们可以
# 可以通过
# 太大
# 希望能
# 然后再
# 你可
# 可选
# 谢谢大家
# 我们必须
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在景安云服务器上绑定域名并配置虚拟主机?
Mybatis 中的insertOrUpdate操作
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
HTML 中动态设置元素 name 属性的正确语法详解
Laravel如何使用Gate和Policy进行授权?(权限控制)
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Laravel怎么调用外部API_Laravel Http Client客户端使用
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
动图在线制作网站有哪些,滑动动图图集怎么做?
如何用IIS7快速搭建并优化网站站点?
如何用美橙互联一键搭建多站合一网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
如何在IIS7上新建站点并设置安全权限?
如何在阿里云ECS服务器部署织梦CMS网站?
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
音乐网站服务器如何优化API响应速度?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
网站制作企业,网站的banner和导航栏是指什么?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel Session怎么存储_Laravel Session驱动配置详解
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
JavaScript如何实现错误处理_try...catch如何捕获异常?
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
javascript中的try catch异常捕获机制用法分析
高防服务器如何保障网站安全无虞?
利用JavaScript实现拖拽改变元素大小
如何快速搭建FTP站点实现文件共享?
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Laravel如何使用Vite进行前端资源打包?(配置示例)
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
制作企业网站建设方案,怎样建设一个公司网站?
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
,怎么在广州志愿者网站注册?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
微信小程序 闭包写法详细介绍
Laravel如何处理CORS跨域请求?(配置示例)
独立制作一个网站多少钱,建立网站需要花多少钱?
如何用虚拟主机快速搭建网站?详细步骤解析
海南网站制作公司有哪些,海口网是哪家的?
Laravel事件监听器怎么写_Laravel Event和Listener使用教程

