以下是 Kotlin 集合常用操作的 8 大分类:
| # | 分类 | 代表操作 |
|---|---|---|
| 1 | 创建 | listOf · mutableListOf · mapOf · buildList · List(n){} |
| 2 | 转换 | map · flatMap · zip · associate · partition · chunked |
| 3 | 过滤 | filter · filterIsInstance · take/drop · distinct · filterNotNull |
| 4 | 聚合 | fold · reduce · sumOf · count · minBy/maxBy · joinToString |
| 5 | 排序 | sorted · sortedBy · sortedWith · reversed · shuffled |
| 6 | 查找 | find · first/last · any/all/none · contains · indexOf |
| 7 | 分组 | groupBy · groupingBy().eachCount() |
| 8 | 集合运算 | union · intersect · subtract · plus/minus · forEach |
一、创建集合
kotlin
kotlin
// List
val list = listOf(1, 2, 3, 4, 5) // 不可变
val mutableList = mutableListOf(1, 2, 3) // 可变
// Set
val set = setOf(1, 2, 3, 3) // {1, 2, 3} 自动去重
val mutableSet = mutableSetOf(1, 2, 3)
// Map
val map = mapOf("a" to 1, "b" to 2) // 不可变
val mutableMap = mutableMapOf("a" to 1) // 可变
// 其他方式
val listFromRange = (1..5).toList() // [1, 2, 3, 4, 5]
val listBuilt = buildList { add(1); add(2) } // 构建器方式
二、元素访问
kotlin
kotlin
val list = listOf(10, 20, 30, 40, 50)
list[0] // 10,按索引访问
list.first() // 10,第一个元素
list.last() // 50,最后一个元素
list.getOrNull(10) // null,越界返回 null
list.getOrElse(10) { -1 } // -1,越界返回默认值
val map = mapOf("a" to 1, "b" to 2)
map["a"] // 1
map.getOrDefault("c", 0) // 0
map.getValue("a") // 1,不存在则抛异常
三、遍历
kotlin
kotlin
val list = listOf("a", "b", "c")
// forEach
list.forEach { println(it) }
// forEachIndexed
list.forEachIndexed { index, value -> println("$index: $value") }
// for 循环
for (item in list) println(item)
// 遍历 Map
val map = mapOf("x" to 1, "y" to 2)
map.forEach { (k, v) -> println("$k -> $v") }
四、转换操作
kotlin
kotlin
val list = listOf(1, 2, 3, 4, 5)
// map:映射每个元素
list.map { it * 2 } // [2, 4, 6, 8, 10]
// mapIndexed:带索引映射
list.mapIndexed { i, v -> "$i:$v" } // ["0:1", "1:2", ...]
// flatMap:展平嵌套集合
listOf(1, 2, 3).flatMap { listOf(it, it * 10) } // [1, 10, 2, 20, 3, 30]
// flatten:直接展平
listOf(listOf(1, 2), listOf(3, 4)).flatten() // [1, 2, 3, 4]
// zip:合并两个集合
listOf(1, 2, 3).zip(listOf("a", "b", "c")) // [(1,a), (2,b), (3,c)]
// unzip:拆分 Pair 列表
listOf(1 to "a", 2 to "b").unzip() // ([1, 2], [a, b])
// associate:转为 Map
list.associate { it to it * it } // {1=1, 2=4, 3=9, 4=16, 5=25}
list.associateBy { it * 10 } // {10=1, 20=2, ...}
五、过滤操作
kotlin
kotlin
val list = listOf(1, 2, 3, 4, 5, 6)
// filter:保留满足条件的元素
list.filter { it % 2 == 0 } // [2, 4, 6]
// filterNot:保留不满足条件的元素
list.filterNot { it % 2 == 0 } // [1, 3, 5]
// filterIsInstance:按类型过滤
listOf(1, "a", 2, "b").filterIsInstance<String>() // ["a", "b"]
// filterNotNull:过滤 null
listOf(1, null, 2, null).filterNotNull() // [1, 2]
// partition:按条件分成两组
val (evens, odds) = list.partition { it % 2 == 0 }
// evens=[2,4,6], odds=[1,3,5]
// take / drop
list.take(3) // [1, 2, 3]
list.drop(3) // [4, 5, 6]
list.takeWhile { it < 4 } // [1, 2, 3]
list.dropWhile { it < 4 } // [4, 5, 6]
六、排序操作
kotlin
kotlin
val list = listOf(3, 1, 4, 1, 5, 9, 2, 6)
list.sorted() // [1, 1, 2, 3, 4, 5, 6, 9]
list.sortedDescending() // [9, 6, 5, 4, 3, 2, 1, 1]
// 按指定字段排序
data class Person(val name: String, val age: Int)
val people = listOf(Person("Bob", 30), Person("Alice", 25), Person("Tom", 28))
people.sortedBy { it.age } // Alice(25), Tom(28), Bob(30)
people.sortedByDescending { it.name } // Tom, Bob, Alice
// 多字段排序
people.sortedWith(compareBy({ it.age }, { it.name }))
// 反转
list.reversed() // [6, 2, 9, 5, 1, 4, 1, 3]
七、聚合操作
kotlin
kotlin
val list = listOf(1, 2, 3, 4, 5)
list.sum() // 15
list.count() // 5
list.count { it > 3 } // 2
list.average() // 3.0
list.min() // 1
list.max() // 5
list.minOrNull() // 1(推荐,避免空集合异常)
list.maxOrNull() // 5
// reduce:无初始值聚合
list.reduce { acc, i -> acc + i } // 15
// fold:有初始值聚合
list.fold(10) { acc, i -> acc + i } // 25
// sumOf / maxOf / minOf
list.sumOf { it * 2 } // 30
list.maxOf { it * it } // 25
list.minOf { it + 10 } // 11
八、分组操作
kotlin
kotlin
val list = listOf(1, 2, 3, 4, 5, 6)
// groupBy:按条件分组
list.groupBy { if (it % 2 == 0) "even" else "odd" }
// {odd=[1,3,5], even=[2,4,6]}
// chunked:按固定大小分块
list.chunked(2) // [[1,2], [3,4], [5,6]]
// windowed:滑动窗口
list.windowed(3) // [[1,2,3],[2,3,4],[3,4,5],[4,5,6]]
list.windowed(3, step = 2) // [[1,2,3],[3,4,5]]
九、查找操作
kotlin
kotlin
val list = listOf(1, 2, 3, 4, 5)
list.find { it > 3 } // 4,第一个满足的
list.findLast { it > 3 } // 5,最后一个满足的
list.any { it > 4 } // true
list.all { it > 0 } // true
list.none { it > 10 } // true
list.contains(3) // true
list.indexOf(3) // 2
list.lastIndexOf(3) // 2
list.binarySearch(3) // 需先排序,返回索引 2
十、集合运算
kotlin
kotlin
val a = setOf(1, 2, 3, 4)
val b = setOf(3, 4, 5, 6)
a union b // {1,2,3,4,5,6} 并集
a intersect b // {3,4} 交集
a subtract b // {1,2} 差集
// List 也支持 + / - 运算符
listOf(1, 2, 3) + listOf(4, 5) // [1,2,3,4,5]
listOf(1, 2, 3, 2) - listOf(2) // [1,3]
十一、可变集合操作
kotlin
kotlin
val list = mutableListOf(1, 2, 3)
list.add(4) // [1,2,3,4]
list.add(0, 0) // [0,1,2,3,4]
list.remove(2) // 移除值为2的元素
list.removeAt(0) // 移除索引0
list.set(0, 99) // 替换索引0
list.clear() // 清空
val map = mutableMapOf("a" to 1)
map["b"] = 2 // 添加/更新
map.remove("a") // 删除
map.getOrPut("c") { 3 } // 不存在则添加并返回
十二、序列(Sequence)------ 惰性求值
kotlin
kotlin
// 普通集合:每步都创建中间集合
val result1 = (1..1_000_000)
.filter { it % 2 == 0 }
.map { it * 3 }
.take(5)
// Sequence:惰性求值,性能更好
val result2 = (1..1_000_000).asSequence()
.filter { it % 2 == 0 }
.map { it * 3 }
.take(5)
.toList() // [6, 12, 18, 24, 30]
// generateSequence:生成无限序列
val fibs = generateSequence(Pair(0, 1)) { Pair(it.second, it.first + it.second) }
.map { it.first }
.take(8)
.toList()