Kotlin 高阶函数和Lambda表达式
高阶函数基础
概念和特点
-
定义
- 接收函数作为参数
- 返回函数作为结果
- 同时满足以上两点的函数
-
语法特点
- 使用
::操作符引用函数 - 使用函数类型声明参数
- 支持函数类型的可空性
- 使用
常见面试题
-
什么是高阶函数?为什么需要高阶函数?
答案: - 高阶函数是将函数用作参数或返回值的函数 - 提高代码复用性和灵活性 - 支持函数式编程范式 - 简化回调和异步操作的处理 -
高阶函数和普通函数的区别是什么?
答案: - 高阶函数可以接收或返回函数 - 支持更灵活的编程模式 - 可以实现策略模式和装饰器模式 - 便于实现DSL(领域特定语言)
Lambda表达式
基本语法
-
特点
- 匿名函数
- 可以包含多个语句
- 最后一个表达式作为返回值
-
语法糖
- it 关键字
- 隐式返回
- 类型推断
实战示例
-
集合操作
val numbers = listOf(1, 2, 3, 4, 5) val doubled = numbers.map { it * 2 } val filtered = numbers.filter { it % 2 == 0 } -
自定义高阶函数
fun operation(x: Int, y: Int, op: (Int, Int) -> Int): Int { return op(x, y) } val sum = operation(1, 2) { a, b -> a + b }
作用域函数
-
常用作用域函数
- let
- run
- with
- apply
- also
-
使用场景
- 对象配置
- 空安全调用
- 临时作用域
面试考点
-
作用域函数的选择
问:如何选择合适的作用域函数? 答: - let:处理可空对象,链式调用 - run:对象配置和计算结果 - with:对同一个对象进行多次操作 - apply:对象配置,返回对象本身 - also:执行额外操作,不改变原对象 -
Lambda表达式的性能
问:Lambda表达式会带来性能开销吗? 答: - 内联函数可以消除Lambda的运行时开销 - 非内联Lambda会创建匿名类实例 - 合理使用inline关键字优化性能
最佳实践
-
使用建议
- 合理使用内联函数
- 避免过度嵌套Lambda
- 保持Lambda表达式简洁
- 注意变量捕获的影响
-
常见陷阱
- 注意this的指向
- 避免过度使用作用域函数
- 处理好异常情况
- 注意内存泄漏风险
总结
-
核心优势
- 代码更加简洁优雅
- 提高代码复用性
- 支持函数式编程
- 便于单元测试
-
应用场景
- 集合操作
- 异步回调
- DSL构建
- 链式调用