Kotlin 集合常用操作

以下是 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()      
相关推荐
pengyu12 小时前
【Kotlin 协程修仙录 · 金丹境 · 后阶】 | 异常防火墙:supervisorScope 与异常隔离的终极奥义
android·kotlin
夏沫琅琊14 小时前
Jetpack Compose + 原生 PDF API 从零搭一个 Android 工具应用 (一)
android·pdf·kotlin
疏狂难除1 天前
JetBrains IDE插件开发教程(五)——File Header
ide·kotlin
Kapaseker2 天前
Android CLI 完全指南
android·kotlin
Coffeeee3 天前
Android功耗优化,哪些代码会让你的机子发热又耗电
android·架构·kotlin
Android打工仔3 天前
Kotlin 编译器是如何把 suspend 函数变成状态机的?
kotlin
Android打工仔3 天前
一个 suspend 函数,为什么会变成一个普通函数?
kotlin
苦瓜花3 天前
【Kotlin】初入门
android·开发语言·kotlin
Kapaseker4 天前
Rust 是如何处理异常的
rust·kotlin
冬日砥砺前行4 天前
Kotlin 协程:几个曾经被我误解的点
kotlin