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"]
相关推荐
Kristen_YXQDN9 小时前
PyCharm 中 pytest 运行 python 测试文件报错:D:\Python_file\.venv\Scripts\python.exe: No module named pytest
运维·开发语言·python·pycharm·pytest
IMPYLH9 小时前
Lua 的 Debug(调试) 模块
开发语言·笔记·python·单元测试·lua·fastapi
王老师青少年编程9 小时前
csp信奥赛C++标准模板库STL(3):list的使用详解
c++·容器·stl·list·标准模板库·csp·信奥赛
九死九歌9 小时前
【Sympydantic】使用sympydantic,利用pydantic告别numpy与pytorch编程中,tensor形状带来的烦人痛点!
开发语言·pytorch·python·机器学习·numpy·pydantic
Kiri霧9 小时前
Go切片详解
开发语言·后端·golang
二进制coder9 小时前
C++ 中的 Interface:概念、实现与应用详解
开发语言·c++
古城小栈9 小时前
Go 与 Rust:系统编程语言的竞争与融合
开发语言·golang·rust
随风一样自由9 小时前
React编码时,什么时候用js文件,什么时候用jsx文件?
开发语言·javascript·react.js
by__csdn9 小时前
Vue3 生命周期全面解析:从创建到销毁的完整指南
开发语言·前端·javascript·vue.js·typescript·前端框架·ecmascript
小年糕是糕手9 小时前
【C++同步练习】模板初阶
服务器·开发语言·前端·javascript·数据库·c++·改行学it