1. 概述

在本篇短文中,我们将探讨如何在 Kotlin 中将 List 转换为 Array。同时,我们也会讨论在日常开发中,选择 List 还是 Array 的最佳实践

为了验证转换结果,我们使用单元测试中的断言进行验证,确保代码行为符合预期。

2. 将 List 转换为 Array

在 Kotlin 中,List 转换为 Array 最直接的方式是使用 Collection.toTypedArray() 扩展函数。来看一个简单示例:

val myList = listOf("one", "two", "three", "four", "five")
val expectedArray = arrayOf("one", "two", "three", "four", "five")
assertThat(myList.toTypedArray()).isEqualTo(expectedArray)

这段代码执行后测试会通过,说明转换是正确的。由于 toTypedArray() 是定义在 Collection 接口上的扩展函数,因此它适用于所有 Collection 的实现类,包括 ListSet

Kotlin 中除了 Array<T> 之外,还提供了专门的原始类型数组,例如 IntArrayLongArray 等。这些原始类型数组在性能上优于泛型数组,因此在处理原始类型时应优先使用它们

Kotlin 为这些原始类型也提供了相应的扩展函数,例如 Collection<Long>.toLongArray()

val myList = listOf(1L, 2L, 3L, 4L, 5L)
val expectedArray = longArrayOf(1L, 2L, 3L, 4L, 5L)
assertThat(myList.toLongArray()).isEqualTo(expectedArray)

通过这些方法,我们可以非常方便地将集合转换为对应的原始类型数组。

3. 为什么更推荐使用 List 而不是 Array

虽然 ListArray 在功能上看起来很相似,但在 Kotlin 的日常开发中,我们更推荐使用 List(或 MutableList)而不是 Array

以下是一些关键原因:

不可变性优先
List 是不可变的(除非使用 MutableList),而 Array 是可变的。在现代编程中,我们倾向于减少可变状态,以降低并发和副作用带来的风险。

动态扩容能力
Array 是固定大小的,一旦创建就无法改变长度;而 MutableList 可以很方便地添加或删除元素。

类型协变支持
List<T> 是协变的(covariant),例如:

val list: List<Number> = listOf(1, 2, 3)

这是合法的,因为 List<Int> 可以被当作 List<Number> 使用。但下面这段代码会编译失败:

val array: Array<Number> = arrayOf(1, 2, 3) // ❌ 编译错误

因为 Array<Int> 并不是 Array<Number> 的子类型。

功能更丰富
ListMutableList 提供了比 Array 更多的操作方法,比如 mapfiltersorted 等,使用起来更加直观和函数式。

⚠️ 性能考量
当然,Array 在某些特定的性能敏感场景下(比如频繁访问、内存连续性要求)确实有优势。但在大多数业务场景中,这种差异可以忽略不计。

因此,除非你确实遇到了性能瓶颈,否则**在日常开发中应优先使用 List 而非 Array**。

4. 总结

本文我们学习了如何在 Kotlin 中将 List 转换为 Array,并探讨了为何在大多数情况下应优先使用 List 而不是 Array

完整示例代码可参考 GitHub 仓库



原始标题:Convert a List Into an Array in Kotlin