Kotlin中的函数式编程:原理与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程
```html

Kotlin 函数式编程入门



Kotlin 是一种现代多范式语言,它有机地结合了面向对象编程和函数式编程。函数式风格可以编写出更可预测、更简洁且更易测试的代码。在本文中,我们将解析 Kotlin 中函数式编程(FP)的关键概念:纯函数、数据不可变性、高阶函数以及通过 map、filter 和 fold 操作集合。本材料面向已经熟悉 Kotlin 基础语法的开发者。



纯函数与不可变性



什么是纯函数?

纯函数是指满足以下条件的函数:

  • 对于相同的参数,始终返回相同的结果(确定性)。
  • 没有副作用(不修改外部状态,不读取全局变量,不执行输入/输出)。


纯函数的示例:

fun sum(a: Int, b: Int): Int = a + b


非纯函数的示例(依赖于外部状态):

var counter = 0fun impureSum(a: Int, b: Int): Int {    counter++ // 副作用    return a + b}


不可变性(immutability)

在函数式编程中,通常避免在数据创建后对其进行修改。在 Kotlin 中,通过以下方式实现:

  • 使用 val 而不是 var 声明不可变引用。
  • 不可变集合:listOf、mapOf、setOf。
  • 通过 data 类的 copy() 方法创建带有修改的副本。


data class User(val name: String, val age: Int)

fun main() { val user = User("Alice", 25) val updatedUser = user.copy(age = 26) // 创建新副本 println(user) // User(name=Alice, age=25) println(updatedUser) // User(name=Alice, age=26)}


不可变性的优势:简化调试、线程安全、代码可预测性。



高阶函数与 Lambda 表达式



函数作为值

在 Kotlin 中,函数可以作为参数传递、从其他函数返回并存储在变量中。这是函数式风格的基础。



// 接受另一个函数的函数fun operateOnNumbers(a: Int, b: Int, operation: (Int, Int) -> Int): Int {    return operation(a, b)}

fun main() { val sum = operateOnNumbers(5, 3) { x, y -> x + y } val product = operateOnNumbers(5, 3) { x, y -> x * y } println("和: $sum, 积: $product")}


Lambda 表达式

Lambda 是一种以紧凑形式编写的匿名函数。语法:{ 参数 -> 函数体 }。



val square: (Int) -> Int = { x -> x * x }val result = square(4) // 16

// 如果只有一个参数,可以使用隐式名称 itval double: (Int) -> Int = { it * 2 }


内置高阶函数

Kotlin 提供了许多用于操作集合的有用函数:

  • map — 转换每个元素。
  • filter — 保留满足条件的元素。
  • fold — 将集合折叠为单个值,带有初始累加器。


fun main() {    val numbers = listOf(1, 2, 3, 4, 5)

// map: 计算平方 val squares = numbers.map { it * it } println(squares) // [1, 4, 9, 16, 25]

// filter: 只保留偶数 val evens = numbers.filter { it % 2 == 0 } println(evens) // [2, 4]

// fold: 所有元素的总和 val sum = numbers.fold(0) { acc, element -> acc + element } println(sum) // 15

// 链式调用:偶数的平方 val evenSquares = numbers .filter { it % ```

博客

书籍推荐