Kotlin 集合操作

149 阅读2分钟

一、集合分类

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 按条件分组为 Map

    listOf("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 注解)

最佳实践建议

  1. 优先使用不可变集合,除非需要修改
  2. 链式调用时注意操作顺序(如先 filter 再 map
  3. 大数据处理优先使用 Sequence
  4. 利用 let 或 run 简化集合处理作用域

通过组合这些操作,可以写出更简洁、高效的集合处理代码。例如:

dataList
    .filter { it.age > 18 }
    .groupBy { it.city }
    .mapValues { (_, users) -> users.map { it.name } }

友情链接:我的总结大概,这个写的详细