跳转到内容

Kotlin集合转换

来自代码酷
Admin留言 | 贡献2025年5月2日 (五) 00:22的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)


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 }

分组转换[编辑 | 编辑源代码]

flowchart LR A[原始集合] --> B{groupBy操作} B --> C[分组结果Map]

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支持对数值集合进行数学运算:

i=1nxi

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代码,同时保持代码的可读性和性能。