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()      
相关推荐
JMchen1232 小时前
第 1 篇|Kotlin 基础入门 —— 变量、函数与空安全
开发语言·kotlin·android 入门·kotlin 空安全·android 零基础
常利兵1 天前
Kotlin类型魔法:Any、Unit、Nothing 深度探秘
android·开发语言·kotlin
tmacfrank1 天前
Kotlin 协程十一 —— 协作、互斥锁与共享变量
java·开发语言·kotlin
Kapaseker1 天前
我再也不用求设计做阴影了 — Compose 阴影
android·kotlin
Fate_I_C2 天前
空安全与类型系统
安全·kotlin
Lambert_lin02 天前
Android grade9.0 之后 自定义apk 名称
android·kotlin
Kapaseker2 天前
“点击显示全文” — Compose 实现
android·kotlin
zzb15802 天前
Kotlin 密封类与延迟初始化学习笔记
笔记·学习·kotlin