Kotlin List扩展函数使用指南

常见 List 扩展函数及使用实例

  1. map:转换每个元素

    • 含义:对列表中的每个元素应用一个转换函数,返回新列表。

    • 使用实例

      kotlin 复制代码
      val numbers = listOf(1, 2, 3)
      val squared = numbers.map { it * it }  // 每个元素平方
      println(squared)  // 输出: [1, 4, 9]
  2. filter:过滤元素

    • 含义:返回满足条件的元素组成的新列表。

    • 使用实例

      kotlin 复制代码
      val numbers = listOf(1, 2, 3, 4)
      val evens = numbers.filter { it % 2 == 0 }  // 过滤出偶数
      println(evens)  // 输出: [2, 4]
  3. forEach:遍历元素

    • 含义:对每个元素执行操作,无返回值(用于副作用)。

    • 使用实例

      kotlin 复制代码
      val names = listOf("Alice", "Bob", "Charlie")
      names.forEach { println("Hello, $it!") }  // 输出每个名字的问候
      // 输出: 
      // Hello, Alice!
      // Hello, Bob!
      // Hello, Charlie!
  4. any:检查是否存在元素满足条件

    • 含义 :如果至少一个元素满足条件,返回 true;否则 false

    • 使用实例

      kotlin 复制代码
      val numbers = listOf(1, 3, 5)
      val hasEven = numbers.any { it % 2 == 0 }  // 检查是否有偶数
      println(hasEven)  // 输出: false
  5. all:检查所有元素满足条件,none正好相反,检查所有元素不满足条件

    • 含义 :如果所有元素都满足条件,返回 true;否则 false

    • 使用实例

      kotlin 复制代码
      val numbers = listOf(2, 4, 6)
      val allEven = numbers.all { it % 2 == 0 }  // 检查是否全为偶数
      println(allEven)  // 输出: true
  6. find:查找第一个满足条件的元素

    • 含义 :返回第一个满足条件的元素(可选类型),若无则返回 null

    • 使用实例

      kotlin 复制代码
      val numbers = listOf(1, 2, 3, 4)
      val firstEven = numbers.find { it % 2 == 0 }  // 查找第一个偶数
      println(firstEven)  // 输出: 2
  7. firstlast:获取首尾元素

    • 含义first 返回第一个元素(或满足条件的第一个),last 返回最后一个元素(或满足条件的最后一个)。如果列表为空,会抛出异常;使用 firstOrNulllastOrNull 可避免异常。

    • 使用实例

      kotlin 复制代码
      val numbers = listOf(1, 2, 3)
      println(numbers.first())  // 输出: 1
      println(numbers.last { it > 1 })  // 输出: 3 (条件: 大于1)
  8. reducefold:聚合操作

    • 含义reduce 从第一个元素开始累积(无初始值),fold 从指定初始值开始累积。常用于求和、求积等。

    • 使用实例

      kotlin 复制代码
      val numbers = listOf(1, 2, 3)
      val sumReduce = numbers.reduce { acc, num -> acc + num }  // 累积和: 1+2+3
      println(sumReduce)  // 输出: 6
      
      val sumFold = numbers.fold(10) { acc, num -> acc + num }  // 从10开始累积
      println(sumFold)  // 输出: 16
  9. groupBy:分组元素

    • 含义 :根据键生成函数分组元素,返回一个 Map(键为分组依据,值为元素列表)。

    • 只要"分组列表" → 用 groupBy。
      想复用 Map → 用 groupByTo。
      只想聚合统计(计数、求和等)→ 用 groupingBy + 后续聚合,更快更省内存。

    • 使用实例

      kotlin 复制代码
      val words = listOf("apple", "banana", "cherry")
      val byLength = words.groupBy { it.length }  // 按单词长度分组
      println(byLength)  // 输出: {5=["apple", "cherry"], 6=["banana"]}
  10. associate:将集合元素转换为键值对

    • 使用实例

      kotlin 复制代码
      val numbers = listOf("one", "two", "three")
      val map = numbers.associate { it to it.length }
      
      // 输出:{one=3, two=3, three=5}
      println(map)
    • associateBy 类似于 associate,但仅通过元素生成键,值默认是元素本身。可以指定一个自定义的值转换函数。

    • 使用示例:

      kotlin 复制代码
      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 直接使用集合元素作为键,并通过转换函数生成值。

    • 使用示例:

      kotlin 复制代码
      val numbers = listOf("one", "two", "three")
      val map = numbers.associateWith { it.length }
      
      // 输出:{one=3, two=3, three=5}
      println(map)
    • associateTo 允许将键值对添加到目标 MutableMap 中,而不是直接返回新 Map。适用于增量构建 Map

    • 使用示例:

      kotlin 复制代码
      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)
  11. chunked(分块)通常指将数据或序列按固定大小分割成连续的块。每块的大小相同,块与块之间不重叠。

    • chunked使用示例

      kotlin 复制代码
      val list = listOf(1, 2, 3, 4, 5, 6)
      val chunkedList = list.chunked(2) // 分块大小为2
      println(chunkedList) // 输出: [[1, 2], [3, 4], [5, 6]]
  12. windowed(滑动窗口)指按固定窗口大小滑动遍历数据或序列,窗口之间可以有重叠。

    • windowed示例

      kotlin 复制代码
      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]]
    • 带步长的windowed

      kotlin 复制代码
      val windowedWithStep = list.windowed(3, step = 2) // 窗口步长为2
      println(windowedWithStep) // 输出: [[1, 2, 3], [3, 4, 5]]
    • 部分窗口(partialWindows)

      kotlin 复制代码
      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]]
  13. 其他常用函数

    • sortedBy:按指定条件排序,返回新列表。例如:listOf(3, 1, 2).sortedBy { it } 输出 [1, 2, 3]
    • sortedByDescending:降序
    • sumBy:计算元素属性的和。例如:listOf("a", "ab").sumBy { it.length } 输出 3(长度和)。
    • takedrop:取前N个元素或跳过前N个元素。例如:listOf(1, 2, 3).take(2) 输出 [1, 2]
与 Map 扩展函数的比较

Kotlin 的 Map(如 Map<K, V>)也有类似扩展函数,但存在关键差异,因为 Map 是键值对集合,而 List 是索引序列。以下是主要异同点:

  • 相同点
    • 许多高阶函数名相同,如 mapfilterforEachanyallgroupBy 等,因为它们基于相同的高阶函数设计模式。

    • 函数含义类似:例如,map 用于转换元素,filter 用于过滤。

    • 使用实例相似(但参数需适应键值对):

      kotlin 复制代码
      // 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"]
相关推荐
草莓熊Lotso7 小时前
《算法闯关指南:优选算法--前缀和》--27.寻找数组的中心下标,28.除自身以外数组的乘积
开发语言·c++·算法·rpc
想不明白的过度思考者7 小时前
Rust——Trait 定义与实现:从抽象到实践的深度解析
开发语言·后端·rust
凤年徐7 小时前
Rust async/await 语法糖的展开原理:从表象到本质
开发语言·后端·rust
AnalogElectronic7 小时前
vue3 实现记事本手机版01
开发语言·javascript·ecmascript
Cx330❀7 小时前
《C++ 继承》三大面向对象编程——继承:派生类构造、多继承、菱形虚拟继承概要
开发语言·c++
晨陌y7 小时前
从 “不会” 到 “会写”:Rust 入门基础实战,用一个小项目串完所有核心基础
开发语言·后端·rust
筱砚.7 小时前
【STL——set与multiset容器】
开发语言·c++·stl
Fanfffff7207 小时前
从TSX到JS:深入解析npm run build背后的完整构建流程
开发语言·javascript·npm
Elias不吃糖7 小时前
C++ 中的浅拷贝与深拷贝:概念、规则、示例与最佳实践(笔记)
开发语言·c++·浅拷贝·深拷贝