Android面试题库
Kotlin特性
Higher Order Functions

Kotlin 高阶函数和Lambda表达式

高阶函数基础

概念和特点

  1. 定义

    • 接收函数作为参数
    • 返回函数作为结果
    • 同时满足以上两点的函数
  2. 语法特点

    • 使用 :: 操作符引用函数
    • 使用函数类型声明参数
    • 支持函数类型的可空性

常见面试题

  1. 什么是高阶函数?为什么需要高阶函数?

    答案:
    - 高阶函数是将函数用作参数或返回值的函数
    - 提高代码复用性和灵活性
    - 支持函数式编程范式
    - 简化回调和异步操作的处理
  2. 高阶函数和普通函数的区别是什么?

    答案:
    - 高阶函数可以接收或返回函数
    - 支持更灵活的编程模式
    - 可以实现策略模式和装饰器模式
    - 便于实现DSL(领域特定语言)

Lambda表达式

基本语法

  1. 特点

    • 匿名函数
    • 可以包含多个语句
    • 最后一个表达式作为返回值
  2. 语法糖

    • it 关键字
    • 隐式返回
    • 类型推断

实战示例

  1. 集合操作

    val numbers = listOf(1, 2, 3, 4, 5)
    val doubled = numbers.map { it * 2 }
    val filtered = numbers.filter { it % 2 == 0 }
  2. 自定义高阶函数

    fun operation(x: Int, y: Int, op: (Int, Int) -> Int): Int {
        return op(x, y)
    }
     
    val sum = operation(1, 2) { a, b -> a + b }

作用域函数

  1. 常用作用域函数

    • let
    • run
    • with
    • apply
    • also
  2. 使用场景

    • 对象配置
    • 空安全调用
    • 临时作用域

面试考点

  1. 作用域函数的选择

    问:如何选择合适的作用域函数?
    答:
    - let:处理可空对象,链式调用
    - run:对象配置和计算结果
    - with:对同一个对象进行多次操作
    - apply:对象配置,返回对象本身
    - also:执行额外操作,不改变原对象
  2. Lambda表达式的性能

    问:Lambda表达式会带来性能开销吗?
    答:
    - 内联函数可以消除Lambda的运行时开销
    - 非内联Lambda会创建匿名类实例
    - 合理使用inline关键字优化性能

最佳实践

  1. 使用建议

    • 合理使用内联函数
    • 避免过度嵌套Lambda
    • 保持Lambda表达式简洁
    • 注意变量捕获的影响
  2. 常见陷阱

    • 注意this的指向
    • 避免过度使用作用域函数
    • 处理好异常情况
    • 注意内存泄漏风险

总结

  1. 核心优势

    • 代码更加简洁优雅
    • 提高代码复用性
    • 支持函数式编程
    • 便于单元测试
  2. 应用场景

    • 集合操作
    • 异步回调
    • DSL构建
    • 链式调用