一、集合分类
1. 不可变集合(只读)
- `List`, `Set`, `Map`(创建后不可修改)
- 创建方式:`listOf()`, `setOf()`, `mapOf(key to value)`
2. 可变集合
- `MutableList`, `MutableSet`, `MutableMap`
- 创建方式:`mutableListOf()`, `hashSetOf()`, `mutableMapOf()`
二、常用集合操作函数
1. 转换操作
-
map/mapIndexed转换元素,返回新集合listOf(1, 2, 3).map { it * 2 } // [2, 4, 6] -
flatMap扁平化嵌套集合listOf(listOf(1, 2), listOf(3)).flatMap { it } // [1, 2, 3] -
zip合并两个集合为 Pair 列表listOf("a", "b").zip(listOf(1, 2)) // [("a",1), ("b",2)]
2. 过滤操作
-
filter/filterNot按条件过滤元素listOf(1, 2, 3).filter { it > 1 } // [2, 3] -
take(n)/takeLast(n)取前/后 n 个元素 -
drop(n)丢弃前 n 个元素 -
droplast(n)从尾部过滤,丢弃 n 个元素
3. 聚合操作
-
reduce/fold累积计算结果listOf(1, 2, 3).fold(10) { acc, i -> acc + i } // 16 -
sum(),average(),min(),max()数值集合快速统计
4. 分组与分区
-
groupBy按条件分组为 MaplistOf("a", "ab").groupBy { it.length } // {1=["a"], 2=["ab"]} -
partition按条件分为两个列表val (even, odd) = listOf(1, 2, 3).partition { it % 2 == 0 }
5. 排序操作
sorted()/sortedDescending()自然排序(升序/降序)sortedBy { it.field }按属性排序
6. 元素查找
find { condition }查找首个符合条件的元素first()/last()获取首尾元素any { condition }是否存在符合元素all { condition }是否所有元素符合条件contains {condition}是否包含某个元素elementAt(index:Int)返回索引下的元素
7. 去重操作
distinct()去除重复元素distinctBy { key }按指定属性去重
三、序列(Sequence)优化
对于大数据量的集合处理,使用 asSequence() 转换为序列可提升性能(延迟计算):
list.asSequence()
.filter { it > 2 }
.map { it * 3 }
.toList() // 最终操作触发计算
四、集合特性扩展
List 操作
- 切片:
slice(0..2) - 分块:
chunked(3)(按大小分块) - 窗口:
windowed(3)(滑动窗口)
Set 操作
- 交集:
set1 intersect set2 - 并集:
set1 union set2 - 差集:
set1 subtract set2
Map 操作
- 键值过滤:
filterKeys { },filterValues { } - 键值转换:
mapKeys { },mapValues { }
五、实用扩展
- 加减操作符:
list1 + list2(合并集合)
list - element(移除元素) - 空安全操作:
listOrNull?.map { }或emptyList<T>() - 集合类型转换:
toSet(),toMutableList(),associate { key to value }(转 Map)
六、与 Java 互操作
- Kotlin 集合可直接调用 Java 集合方法
- 使用
list.toTypedArray()转换为 Java 数组 - 注意空安全处理(如
@Nullable注解)
最佳实践建议
- 优先使用不可变集合,除非需要修改
- 链式调用时注意操作顺序(如先
filter再map) - 大数据处理优先使用 Sequence
- 利用
let或run简化集合处理作用域
通过组合这些操作,可以写出更简洁、高效的集合处理代码。例如:
dataList
.filter { it.age > 18 }
.groupBy { it.city }
.mapValues { (_, users) -> users.map { it.name } }