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 %
```