Kotlin中的集合操作

Kotlin 在集合操作上提供了一系列的扩展函数,使其变得非常强大且易于使用。以下是一些在Kotlin中常用的集合操作API,以及如何使用它们的示例:

1. Filtering (过滤)

​ 使用 filter 函数来过滤集合中符合条件的元素。

kotlin 复制代码
val numbers = listOf(1, 2, 3, 4, 5, 6)
val evenNumbers = numbers.filter { it % 2 == 0 } // 结果: [2, 4, 6]

2. Transforming (转换)

​ 使用 map 函数能够将集合中的元素进行转换。

kotlin 复制代码
val numbers = listOf(1, 2, 3, 4, 5, 6)
val squaredNumbers = numbers.map { it * it } // 结果: [1, 4, 9, 16, 25, 36]

3. Flattening (扁平化)

​ 对于嵌套集合,flatten 可以用来将嵌套的集合合并成一个集合,而 flatMap 可以在合并的同时进行转换。

kotlin 复制代码
val numberSets = listOf(setOf(1, 2, 3), setOf(4, 5, 6))
val flattened = numberSets.flatten() // 结果: [1, 2, 3, 4, 5, 6]

val container = listOf(listOf(1), listOf(2, 3), listOf(4, 5, 6))
val flattenedAndTransformed = container.flatMap { it.map { it * it } } // 结果: [1, 4, 9, 16, 25, 36]

4. Zipping (配对)

zip 函数能将两个集合中的元素按位置配对成一个新的集合。

kotlin 复制代码
val a = listOf(1, 2, 3)
val b = listOf("a", "b", "c")
val resultPairs = a.zip(b) // 结果: [(1, "a"), (2, "b"), (3, "c")]

5. Associating (关联)

associateWithassociateBy 用于生成Map,前者将每个元素作为键与某个值关联,后者则是将某个键与每个元素关联。

kotlin 复制代码
val numbers = listOf(1, 2, 3)
val numberToSquare = numbers.associateWith { it * it } // 结果: {1=1, 2=4, 3=9}

val names = listOf("Alice", "Bob", "Clara")
val nameToLength = names.associateBy { it.length } // 结果: {5=Alice, 3=Bob, 5=Clara}

6. Aggregating (聚合)

foldreduce 可用于根据一个起始值(对于 fold)或集合的一个初始元素(对于 reduce)逐个组合集合中的元素。

kotlin 复制代码
val numbers = listOf(1, 2, 3, 4, 5, 6)
val sum = numbers.reduce { total, next -> total + next } // 结果: 21

val startValue = 0
val sumWithStart = numbers.fold(startValue) { total, next -> total + next } // 结果: 21

7. Chunks (分块)

chunked 可以将集合分割为指定大小的小集合。

kotlin 复制代码
val numbers = (1..10).toList()
val chunks = numbers.chunked(3) // 结果: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

8. Grouping (分组)

groupBy 根据指定条件将集合中的元素分组。

kotlin 复制代码
val numbers = listOf("one", "two", "three", "four", "five")
val groupedByLength = numbers.groupBy { it.length } // 结果: {3=["one", "two"], 5=["three"], 4=["four", "five"]}

9. 取集合的各种部分 (Slicing)

​ 可以使用 slice 函数从集合中获取一系列特定的元素。

kotlin 复制代码
val numbers = listOf(1, 2, 3, 4, 5, 6)
val sliced = numbers.slice(1..3) // 结果: [2, 3, 4]

10. 去重 (Distinct)

distinct 函数用于去除集合中的重复元素。

kotlin 复制代码
val numbers = listOf(1, 2, 2, 3, 4, 4, 5)
val distinctNumbers = numbers.distinct() // 结果: [1, 2, 3, 4, 5]

11. 可变集合操作 (Mutable Collections)

​ 对于可变集合,可以使用 add, remove, addAll, removeAll, retainAll 等函数来直接修改集合。

kotlin 复制代码
val mutableListOfNumbers = mutableListOf(1, 2, 3)
mutableListOfNumbers.add(4) // 结果: [1, 2, 3, 4]
mutableListOfNumbers.remove(1) // 结果: [2, 3, 4]

12. Partitioning (分区)

partition 将集合分成两个集合,第一个集合包含符合某个条件的所有元素,第二个集合中则包含所有不符合这个条件的元素。

kotlin 复制代码
val numbers = (1..10).toList()
val (even, odd) = numbers.partition { it % 2 == 0 } // even: [2, 4, 6, 8, 10], odd: [1, 3, 5, 7, 9]

13. 排序 (Sorting)

​ 集合可以按自然顺序或给定的比较器进行排序。

kotlin 复制代码
val numbers = listOf(5, 4, 2, 1, 3)
val sortedNumbers = numbers.sorted() // 结果: [1, 2, 3, 4, 5]

val descendingSortedNumbers = numbers.sortedByDescending { it } // 结果: [5, 4, 3, 2, 1]

14. 判断集合元素的条件 (Any, All, None)

any, allnone 分别用来检查集合中是否有元素满足条件,是否所有元素满足条件,或者是否没有元素满足条件。

kotlin 复制代码
val numbers = listOf(1, 2, 3, 4, 5, 6)
val anyGreaterThanFour = numbers.any { it > 4 } // 结果: true
val allEvenNumbers = numbers.all { it % 2 == 0 } // 结果: false
val noneGreaterThanSix = numbers.none { it > 6 } // 结果: true

15. 取集合的极值 (Min and Max)

​ 可以使用 minOrNullmaxOrNull 函数快速找到集合中的最小值和最大值。

kotlin 复制代码
val numbers = listOf(1, 2, 3, 4, 5, 6)
val maxNumber = numbers.maxOrNull() // 结果: 6
val minNumber = numbers.minOrNull() // 结果: 1

16. 取集合中符合条件的单个元素 (Single Element)

​ 你可以用 first, firstOrNull, last, 和 lastOrNull 来获取集合中的第一个或最后一个符合条件的元素。

kotlin 复制代码
val numbers = listOf(1, 2, 3, 4, 5, 6)
val firstEven = numbers.firstOrNull { it % 2 == 0 } // 结果: 2
val lastLessThanFive = numbers.lastOrNull { it < 5 } // 结果: 4

17. 迭代 (Iteration)

​ 可以使用 forEach 函数对集合进行迭代操作。

kotlin 复制代码
val numbers = listOf(1, 2, 3, 4, 5)
numbers.forEach { println(it) } // 输出每个元素
相关推荐
zhangphil8 小时前
Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现“刮刮乐”效果,Kotlin(2)
android·kotlin
居居飒1 天前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
刘争Stanley2 天前
如何高效调试复杂布局?Layout Inspector 的 Toggle Deep Inspect 完全解析
android·kotlin·android 15·黑屏闪屏白屏
sickworm陈浩2 天前
Java 转 Kotlin 系列:究竟该不该用 lateinit?
android·kotlin
droidHZ3 天前
Compose Multiplatform 之旅—声明式UI
android·kotlin
zhangphil3 天前
Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆角矩形实现,Kotlin(1)
android·kotlin
alexhilton6 天前
Android技巧:学习使用GridLayout
android·kotlin·android jetpack
zhangphil6 天前
Android使用PorterDuffXfermode的模式PorterDuff.Mode.SRC_OUT实现橡皮擦,Kotlin(1)
android·kotlin
IH_LZH7 天前
OkHttp源码分析:分发器任务调配,拦截器责任链设计,连接池socket复用
android·java·okhttp·kotlin
casual_clover8 天前
Android之RecyclerView显示数据列表和网格
android·kotlin