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"]
相关推荐
cyforkk6 小时前
12、Java 基础硬核复习:集合框架(数据容器)的核心逻辑与面试考点
java·开发语言·面试
我材不敲代码10 小时前
Python实现打包贪吃蛇游戏
开发语言·python·游戏
身如柳絮随风扬11 小时前
Java中的CAS机制详解
java·开发语言
韩立学长13 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
froginwe1113 小时前
Scala 循环
开发语言
m0_7066532313 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你9113 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Bruk.Liu14 小时前
(LangChain实战2):LangChain消息(message)的使用
开发语言·langchain
qq_4232339014 小时前
C++与Python混合编程实战
开发语言·c++·算法
m0_7155753414 小时前
分布式任务调度系统
开发语言·c++·算法