Kotlin List扩展函数使用指南
常见 List 扩展函数及使用实例
-
map:转换每个元素- 含义:对列表中的每个元素应用一个转换函数,返回新列表。
- 使用实例:
val numbers = listOf(1, 2, 3) val squared = numbers.map { it * it } // 每个元素平方 println(squared) // 输出: [1, 4, 9]
-
filter:过滤元素- 含义:返回满足条件的元素组成的新列表。
- 使用实例:
val numbers = listOf(1, 2, 3, 4) val evens = numbers.filter { it % 2 == 0 } // 过滤出偶数 println(evens) // 输出: [2, 4]
-
forEach:遍历元素- 含义:对每个元素执行操作,无返回值(用于副作用)。
- 使用实例:
val names = listOf("Alice", "Bob", "Charlie") names.forEach { println("Hello, $it!") } // 输出每个名字的问候 // 输出: // Hello, Alice! // Hello, Bob! // Hello, Charlie!
-
any:检查是否存在元素满足条件- 含义:如果至少一个元素满足条件,返回
true;否则false。 - 使用实例:
val numbers = listOf(1, 3, 5) val hasEven = numbers.any { it % 2 == 0 } // 检查是否有偶数 println(hasEven) // 输出: false
- 含义:如果至少一个元素满足条件,返回
-
all:检查所有元素满足条件,none正好相反,检查所有元素不满足条件- 含义:如果所有元素都满足条件,返回
true;否则false。 - 使用实例:
val numbers = listOf(2, 4, 6) val allEven = numbers.all { it % 2 == 0 } // 检查是否全为偶数 println(allEven) // 输出: true
- 含义:如果所有元素都满足条件,返回
-
find:查找第一个满足条件的元素- 含义:返回第一个满足条件的元素(可选类型),若无则返回
null。 - 使用实例:
val numbers = listOf(1, 2, 3, 4) val firstEven = numbers.find { it % 2 == 0 } // 查找第一个偶数 println(firstEven) // 输出: 2
- 含义:返回第一个满足条件的元素(可选类型),若无则返回
-
first和last:获取首尾元素- 含义:
first返回第一个元素(或满足条件的第一个),last返回最后一个元素(或满足条件的最后一个)。如果列表为空,会抛出异常;使用firstOrNull或lastOrNull可避免异常。 - 使用实例:
val numbers = listOf(1, 2, 3) println(numbers.first()) // 输出: 1 println(numbers.last { it > 1 }) // 输出: 3 (条件: 大于1)
- 含义:
-
reduce和fold:聚合操作- 含义:
reduce从第一个元素开始累积(无初始值),fold从指定初始值开始累积。常用于求和、求积等。 - 使用实例:
val numbers = listOf(1, 2, 3) val sumReduce = numbers.reduce { acc, num -> acc + num } // 累积和: 1+2+3 println(sumReduce) // 输出: 6val sumFold = numbers.fold(10) { acc, num -> acc + num } // 从10开始累积 println(sumFold) // 输出: 16
- 含义:
-
groupBy:分组元素- 含义:根据键生成函数分组元素,返回一个
Map(键为分组依据,值为元素列表)。 - 只要“分组列表” → 用 groupBy。
想复用 Map → 用 groupByTo。
只想聚合统计(计数、求和等)→ 用 groupingBy + 后续聚合,更快更省内存。 - 使用实例:
val words = listOf("apple", "banana", "cherry") val byLength = words.groupBy { it.length } // 按单词长度分组 println(byLength) // 输出: {5=["apple", "cherry"], 6=["banana"]}
- 含义:根据键生成函数分组元素,返回一个
-
associate:将集合元素转换为键值对-
使用实例:
val numbers = listOf("one", "two", "three") val map = numbers.associate { it to it.length }// 输出:{one=3, two=3, three=5} println(map) -
associateBy类似于associate,但仅通过元素生成键,值默认是元素本身。可以指定一个自定义的值转换函数。 -
使用示例:
val numbers = listOf("one", "two", "three") val map1 = numbers.associateBy { it.length } // 键:长度,值:元素本身 val map2 = numbers.associateBy({ it.length }, { it.uppercase() }) // 键:长度,值:大写元素// 输出:{3=one, 3=two, 5=three} println(map1)// 输出:{3=ONE, 3=TWO, 5=THREE} println(map2) -
associateWith直接使用集合元素作为键,并通过转换函数生成值。 -
使用示例:
val numbers = listOf("one", "two", "three") val map = numbers.associateWith { it.length }// 输出:{one=3, two=3, three=5} println(map) -
associateTo允许将键值对添加到目标MutableMap中,而不是直接返回新Map。适用于增量构建Map。 -
使用示例:
val numbers = listOf("one", "two", "three") val targetMap = mutableMapOf<String, Int>() numbers.associateTo(targetMap) { it to it.length }// 输出:{one=3, two=3, three=5} println(targetMap)
-
-
chunked(分块)通常指将数据或序列按固定大小分割成连续的块。每块的大小相同,块与块之间不重叠。chunked使用示例val list = listOf(1, 2, 3, 4, 5, 6) val chunkedList = list.chunked(2) // 分块大小为2 println(chunkedList) // 输出: [[1, 2], [3, 4], [5, 6]]
-
windowed(滑动窗口)指按固定窗口大小滑动遍历数据或序列,窗口之间可以有重叠。-
windowed示例val list = listOf(1, 2, 3, 4, 5) val windowedList = list.windowed(3) // 窗口大小为3 println(windowedList) // 输出: [[1, 2, 3], [2, 3, 4], [3, 4, 5]] -
带步长的windowedval windowedWithStep = list.windowed(3, step = 2) // 窗口步长为2 println(windowedWithStep) // 输出: [[1, 2, 3], [3, 4, 5]] -
部分窗口(partialWindows)val list = listOf(1, 2, 3, 4) val partialResult = list.windowed(3, partialWindows = true) println(partialResult) // 输出: [[1, 2, 3], [2, 3, 4], [3, 4], [4]]
-
-
其他常用函数:
sortedBy:按指定条件排序,返回新列表。例如:listOf(3, 1, 2).sortedBy { it }输出[1, 2, 3]。sortedByDescending:降序sumBy:计算元素属性的和。例如:listOf("a", "ab").sumBy { it.length }输出3(长度和)。take和drop:取前N个元素或跳过前N个元素。例如:listOf(1, 2, 3).take(2)输出[1, 2]。
与 Map 扩展函数的比较
Kotlin 的 Map(如 Map<K, V>)也有类似扩展函数,但存在关键差异,因为 Map 是键值对集合,而 List 是索引序列。以下是主要异同点:
- 相同点:
- 许多高阶函数名相同,如
map、filter、forEach、any、all、groupBy等,因为它们基于相同的高阶函数设计模式。 - 函数含义类似:例如,
map用于转换元素,filter用于过滤。 - 使用实例相似(但参数需适应键值对):
// Map 的 map 示例:转换每个键值对 val map = mapOf("a" to 1, "b" to 2) val doubled = map.map { (key, value) -> "$key:${value * 2}" } // 返回 List<String> println(doubled) // 输出: ["a:2", "b:4"]
- 许多高阶函数名相同,如
