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
的实现类,包括 List
和 Set
。
Kotlin 中除了 Array<T>
之外,还提供了专门的原始类型数组,例如 IntArray
、LongArray
等。这些原始类型数组在性能上优于泛型数组,因此在处理原始类型时应优先使用它们。
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
虽然 List
和 Array
在功能上看起来很相似,但在 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>
的子类型。
✅ 功能更丰富List
和 MutableList
提供了比 Array
更多的操作方法,比如 map
、filter
、sorted
等,使用起来更加直观和函数式。
⚠️ 性能考量
当然,Array
在某些特定的性能敏感场景下(比如频繁访问、内存连续性要求)确实有优势。但在大多数业务场景中,这种差异可以忽略不计。
因此,除非你确实遇到了性能瓶颈,否则**在日常开发中应优先使用 List
而非 Array
**。
4. 总结
本文我们学习了如何在 Kotlin 中将 List
转换为 Array
,并探讨了为何在大多数情况下应优先使用 List
而不是 Array
。
完整示例代码可参考 GitHub 仓库。