Kotlin 中 Array 的扩展函数

Kotlin 为 Array 提供了丰富的扩展函数(基于标准库),涵盖遍历、转换、过滤、查找、排序、聚合 等多种场景,极大简化了数组操作。下面按功能分类详细讲解核心扩展函数,附带代码示例和使用说明。

一、遍历相关扩展函数

这类函数用于便捷地遍历数组元素,替代传统的 for 循环,更贴合 Kotlin 函数式编程风格。

1. forEach

  • 功能:遍历数组中所有元素,对每个元素执行指定操作(无返回值)。
  • 示例:

kotlin

fun main() {

val arr = arrayOf("dog", "racecar", "car")

arr.forEach { str -> println("元素:$str") }

// 简化写法(参数仅使用一次时)

arr.forEach(::println)}

2. forEachIndexed

  • 功能:遍历数组时,同时获取元素的索引 和对应值,适合需要索引的场景。
  • 示例:

kotlin

fun main() {

val arr = arrayOf("dog", "racecar", "car")

arr.forEachIndexed { index, str ->

println("索引 index:元素 str")

}}

二、转换相关扩展函数

这类函数用于将原数组转换为新的集合或数组,不修改原数组,返回新的结果。

1. map

  • 功能:对数组中每个元素执行转换操作,返回转换后的 List 集合(可通过 toTypedArray() 转为数组)。
  • 示例:将字符串数组转换为每个字符串的长度列表

kotlin

fun main() {

val arr = arrayOf("dog", "racecar", "car")

// 转换:字符串 -> 字符串长度

val lengthList = arr.map { it.length }

val lengthArray = arr.map { it.length }.toTypedArray()

println("转换后的List:$lengthList") // [3, 7, 3]

println("转换后的Array:${lengthArray.contentToString()}") // [3, 7, 3]}

2. mapIndexed

  • 功能:转换时同时获取元素索引,支持基于索引的转换逻辑。
  • 示例:给数组元素添加索引前缀

kotlin

fun main() {

val arr = arrayOf("dog", "racecar", "car")

val indexedList = arr.mapIndexed { index, str ->

"index - str"

}

println(indexedList) // [0 - dog, 1 - racecar, 2 - car]}

3. flatMap

  • 功能:先对每个元素做转换(返回一个可迭代对象),再将所有结果扁平化为一个 List(解除嵌套)。
  • 示例:拆分字符串数组中的每个字符,生成扁平列表

kotlin

fun main() {

val arr = arrayOf("dog", "car")

// 先将每个字符串转为字符数组,再扁平化为单个列表

val charList = arr.flatMap { it.toList() }

println(charList) // [d, o, g, c, a, r]}

三、过滤相关扩展函数

这类函数用于根据指定条件筛选数组元素,返回符合条件的元素集合。

1. filter

  • 功能:筛选出满足条件的所有元素,返回 List 集合。
  • 示例:筛选出长度大于 3 的字符串

kotlin

fun main() {

val arr = arrayOf("dog", "racecar", "car")

val longStrList = arr.filter { it.length > 3 }

println(longStrList) // [racecar]}

2. filterIndexed

  • 功能:筛选时同时获取元素索引,支持基于索引的筛选逻辑。
  • 示例:筛选出索引为偶数且长度大于 2 的元素

kotlin

fun main() {

val arr = arrayOf("dog", "racecar", "car")

val filteredList = arr.filterIndexed { index, str ->

index % 2 == 0 && str.length > 2

}

println(filteredList) // [dog, car]}

3. filterNotNull

  • 功能:筛选出数组中的非 null 元素,适合处理可空类型数组(Array<T?>)。
  • 示例:过滤可空字符串数组中的 null 值

kotlin

fun main() {

val arr: Array<String?> = arrayOf("dog", null, "racecar", "car", null)

val nonNullList = arr.filterNotNull()

println(nonNullList) // [dog, racecar, car]}

四、查找相关扩展函数

这类函数用于查找数组中符合条件的元素,返回单个元素或 null(避免空指针)。

1. first()/** firstOrNull()**

  • 功能:
    • first():返回数组中第一个 元素(或第一个满足条件的元素),无符合条件元素时抛出异常。
    • firstOrNull():返回数组中第一个符合条件的元素,无符合条件元素时返回 null(推荐,更安全)。
  • 示例:

kotlin

fun main() {

val arr = arrayOf("dog", "racecar", "car")

// 无条件获取第一个元素

val firstElem = arr.first()

println("第一个元素:$firstElem") // dog

// 有条件查找(第一个长度大于 3 的元素)

val firstLongStr = arr.firstOrNull { it.length > 3 }

println("第一个长字符串:$firstLongStr") // racecar

// 无符合条件元素时返回 null

val firstExtraLongStr = arr.firstOrNull { it.length > 10 }

println("超长字符串:$firstExtraLongStr") // null}

2. last()/** lastOrNull()**

  • 功能:与 first() / firstOrNull() 对应,返回数组中最后一个 符合条件的元素,lastOrNull() 无符合条件元素时返回 null。
  • 示例:

kotlin

fun main() {

val arr = arrayOf("dog", "racecar", "car")

val lastElem = arr.last()

val lastLongStr = arr.lastOrNull { it.length > 3 }

println("最后一个元素:$lastElem") // car

println("最后一个长字符串:$lastLongStr") // racecar}

3. find()/** findLast()**

  • 功能:
    • find() 等价于 firstOrNull(),返回第一个符合条件的元素。
    • findLast() 等价于 lastOrNull(),返回最后一个符合条件的元素。
  • 示例:

kotlin

fun main() {

val arr = arrayOf("dog", "racecar", "car")

val findStr = arr.find { it.startsWith("c") }

println("以 c 开头的第一个元素:$findStr") // car}

4. contains()

  • 功能:判断数组是否包含指定元素,返回 Boolean,也可使用 in 关键字(语法糖)。
  • 示例:

kotlin

fun main() {

val arr = arrayOf("dog", "racecar", "car")

val hasDog = arr.contains("dog")

val hasCat = "cat" in arr

println("是否包含 dog:$hasDog") // true

println("是否包含 cat:$hasCat") // false}

五、排序相关扩展函数

这类函数用于对数组进行排序,分为「返回新数组」和「原地排序」两种类型。

1. sorted()/** sortedDescending()**

  • 功能:返回一个新的排序后数组 (原数组保持不变),sorted() 升序排列,sortedDescending() 降序排列。
  • 示例:

kotlin

fun main() {

val arr = arrayOf(3, 1, 4, 2)

val sortedArr = arr.sorted() // 升序,返回 List

val sortedDescArr = arr.sortedDescending().toTypedArray() // 降序,转为 Array

println("原数组:${arr.contentToString()}") // [3, 1, 4, 2]

println("升序列表:$sortedArr") // [1, 2, 3, 4]

println("降序数组:${sortedDescArr.contentToString()}") // [4, 3, 2, 1]}

2. sort()/** sortDescending()**

  • 功能:原地排序 (直接修改原数组,无返回值),sort() 升序,sortDescending() 降序。
  • 示例:

kotlin

fun main() {

val arr = arrayOf(3, 1, 4, 2)

arr.sort() // 原地升序排序

println("排序后原数组:${arr.contentToString()}") // [1, 2, 3, 4]

arr.sortDescending() // 原地降序排序

println("降序后原数组:${arr.contentToString()}") // [4, 3, 2, 1]}

3. min()/** max()**

  • 功能:返回数组中最小 / 最大元素 (按元素自然顺序比较,如字符串字典序、数字大小),无元素时返回 null(对应你之前最长公共前缀解法中的核心函数)。
  • 示例:

kotlin

fun main() {

val strArr = arrayOf("dog", "racecar", "car")

val numArr = arrayOf(3, 1, 4, 2)

println("字符串数组最小元素:${strArr.min()}") // car(字典序)

println("数字数组最大元素:${numArr.max()}") // 4}

六、聚合相关扩展函数

这类函数用于对数组元素进行聚合计算,返回一个汇总结果。

1. count()

  • 功能:返回数组元素个数,或满足指定条件的元素个数。
  • 示例:

kotlin

fun main() {

val arr = arrayOf("dog", "racecar", "car")

val totalCount = arr.count()

val longStrCount = arr.count { it.length > 3 }

println("数组总长度:$totalCount") // 3

println("长字符串个数:$longStrCount") // 1}

2. sum()/** sumOf()**

  • 功能:
    • sum():直接对数值类型数组(如 Array<Int>)求和。
    • sumOf():对元素转换后求和,支持非数值类型数组。
  • 示例:

kotlin

fun main() {

val numArr = arrayOf(1, 2, 3, 4)

val strArr = arrayOf("dog", "racecar", "car")

// 数值数组直接求和

val sum = numArr.sum()

println("数值数组求和:$sum") // 10

// 字符串数组按长度求和

val lengthSum = strArr.sumOf { it.length }

println("字符串长度总和:$lengthSum") // 3 + 7 + 3 = 13}

3. fold()/** reduce()**

  • 功能:累计计算数组元素,将前一次计算结果与下一个元素进行操作,最终返回汇总值。
    • reduce():从数组第一个元素开始累计,无初始值。
    • fold():指定初始值,从初始值开始累计(更灵活,支持空数组)。
  • 示例:

kotlin

fun main() {

val arr = arrayOf(1, 2, 3, 4)

// reduce:1 + 2 → 3 + 3 → 6 + 4 → 10

val reduceResult = arr.reduce { acc, num -> acc + num }

println("reduce 求和:$reduceResult") // 10

// fold:初始值 10,10 + 1 → 11 + 2 → 13 + 3 → 16 + 4 → 20

val foldResult = arr.fold(10) { acc, num -> acc + num }

println("fold 求和(初始值 10):$foldResult") // 20}

七、补充说明

  1. 不可变性 :大部分 Array 扩展函数(如 map、filter、sorted)都不会修改原数组,而是返回新的集合 / 数组,符合 Kotlin 推崇的不可变编程思想。
  2. 可空类型适配 :很多扩展函数提供了 OrNull 后缀版本(如 firstOrNull),避免空指针异常,优先使用这类安全函数。
  3. 与 Java 数组的兼容性 :Kotlin Array 可以直接转换为 Java 数组,扩展函数底层兼容 Java 集合框架,使用无额外成本。
  4. 原始类型数组 :对于 IntArray、DoubleArray 等原始类型数组,Kotlin 也提供了对应的扩展函数,用法与 Array<T> 一致,且性能更优(避免自动装箱 / 拆箱)。

总结

  1. Kotlin Array 扩展函数覆盖遍历、转换、过滤、查找、排序、聚合 六大核心场景,简化了数组操作。
  2. 安全优先:优先使用带 OrNull 后缀的查找函数(如 firstOrNull),避免异常。
  3. 区分两种排序:sorted() 返回新数组,sort() 原地修改原数组,按需选择。
  4. 核心高频函数:forEach、map、filter、firstOrNull、min()/max() 是日常开发中使用频率最高的扩展函数。
相关推荐
Kapaseker15 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
Kapaseker2 天前
一杯美式搞定 Kotlin 空安全
android·kotlin
FunnySaltyFish2 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Kapaseker3 天前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
Kapaseker4 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
A0微声z5 天前
Kotlin Multiplatform (KMP) 中使用 Protobuf
kotlin
alexhilton6 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
lhDream6 天前
Kotlin 开发者必看!JetBrains 开源 LLM 框架 Koog 快速上手指南(含示例)
kotlin
RdoZam6 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin
Kapaseker7 天前
研究表明,开发者对Kotlin集合的了解不到 20%
android·kotlin