Kotlin集合转换
外观
Kotlin集合转换是Kotlin标准库中提供的一组强大的操作,允许开发者通过链式调用对集合进行高效的数据处理。这些操作不会修改原始集合,而是返回一个新的集合,符合函数式编程的不可变性原则。本文将详细介绍常见的集合转换操作及其实际应用。
概述[编辑 | 编辑源代码]
在Kotlin中,集合转换是通过扩展函数实现的,主要分为以下几类:
- 映射转换(如`map`、`mapIndexed`)
- 过滤转换(如`filter`、`partition`)
- 排序转换(如`sorted`、`sortedBy`)
- 分组转换(如`groupBy`)
- 扁平化转换(如`flatten`、`flatMap`)
- 聚合操作(如`sum`、`average`)
这些操作可以组合使用,形成复杂的数据处理流水线。
核心转换操作[编辑 | 编辑源代码]
映射转换[编辑 | 编辑源代码]
将集合中的每个元素转换为另一种形式。
val numbers = listOf(1, 2, 3)
val squared = numbers.map { it * it }
println(squared) // 输出: [1, 4, 9]
带索引的版本:
val result = numbers.mapIndexed { index, value -> "$index:$value" }
println(result) // 输出: [0:1, 1:2, 2:3]
过滤转换[编辑 | 编辑源代码]
根据条件筛选集合元素。
val evenNumbers = numbers.filter { it % 2 == 0 }
println(evenNumbers) // 输出: [2]
`partition`将集合分为两个列表:
val (even, odd) = numbers.partition { it % 2 == 0 }
println("偶数: $even, 奇数: $odd") // 输出: 偶数: [2], 奇数: [1, 3]
排序转换[编辑 | 编辑源代码]
val unsorted = listOf(3, 1, 4, 1, 5)
val sorted = unsorted.sorted()
println(sorted) // 输出: [1, 1, 3, 4, 5]
val sortedDesc = unsorted.sortedDescending()
println(sortedDesc) // 输出: [5, 4, 3, 1, 1]
按特定属性排序:
data class Person(val name: String, val age: Int)
val people = listOf(Person("Alice", 29), Person("Bob", 31))
val sortedByAge = people.sortedBy { it.age }
分组转换[编辑 | 编辑源代码]
val words = listOf("apple", "banana", "cherry", "date")
val byLength = words.groupBy { it.length }
println(byLength) // 输出: {5=[apple], 6=[banana, cherry], 4=[date]}
扁平化转换[编辑 | 编辑源代码]
处理嵌套集合:
val nested = listOf(listOf(1, 2), listOf(3, 4))
val flattened = nested.flatten()
println(flattened) // 输出: [1, 2, 3, 4]
`flatMap`结合了映射和扁平化:
val result = words.flatMap { it.toList() }
println(result) // 输出: [a, p, p, l, e, b, a, n, a, n, a, ...]
数学转换[编辑 | 编辑源代码]
Kotlin支持对数值集合进行数学运算:
val sum = numbers.sum()
val avg = numbers.average()
println("总和: $sum, 平均值: $avg") // 输出: 总和: 6, 平均值: 2.0
性能考虑[编辑 | 编辑源代码]
某些转换操作会创建中间集合,对于大型数据集,应考虑使用序列(Sequence):
val largeList = (1..1_000_000).toList()
val result = largeList.asSequence()
.filter { it % 2 == 0 }
.map { it * it }
.take(10)
.toList()
实际案例[编辑 | 编辑源代码]
场景:处理电商订单数据
data class Order(val id: Int, val products: List<String>, val total: Double)
val orders = listOf(
Order(1, listOf("Phone", "Case"), 599.99),
Order(2, listOf("Laptop", "Mouse"), 1299.99)
)
// 获取所有产品列表(去重)
val allProducts = orders.flatMap { it.products }.distinct()
// 按价格区间分组
val priceGroups = orders.groupBy {
when {
it.total < 500 -> "低价"
it.total < 1000 -> "中价"
else -> "高价"
}
}
// 计算平均订单金额
val averageOrder = orders.map { it.total }.average()
总结表[编辑 | 编辑源代码]
操作类型 | 函数 | 描述 |
---|---|---|
映射 | `map`, `mapNotNull` | 元素转换 |
过滤 | `filter`, `filterNot` | 条件筛选 |
排序 | `sorted`, `sortedByDescending` | 排序集合 |
分组 | `groupBy`, `groupingBy` | 创建分组 |
扁平化 | `flatten`, `flatMap` | 处理嵌套集合 |
聚合 | `sum`, `count`, `maxOrNull` | 数学运算 |
通过掌握这些集合转换操作,开发者可以编写出更简洁、更具表达力的Kotlin代码,同时保持代码的可读性和性能。