1. 简介
在 Kotlin 中,数组 是一种常用的数据结构,用于存储一组有序的元素。有时我们会有这样的需求:移除数组中的第一个元素。
⚠️ 但需要注意的是,Kotlin 的数组是固定长度的,无法直接扩容或缩容,因此不能原地删除元素。这意味着我们无法像 ArrayList.remove()
那样直接操作数组本身。
那怎么办?其实思路很清晰:通过创建一个不包含首元素的新数组来“实现”删除效果。
本文将介绍几种常见且实用的方法,并配合 JUnit 测试用例验证其正确性,帮助你在实际开发中避免踩坑。
2. 使用 sliceArray() 创建新数组
sliceArray()
是少数能直接返回 Array
类型的方法之一,非常适合需要保持类型一致性的场景。
我们可以通过指定范围 1 until array.size
来截取从第二个元素开始的所有元素,从而跳过第一个元素。
✅ 示例代码如下:
@Test
fun `Remove first element by creating a slice`() {
val array = arrayOf("Apple", "Banana", "Cherry")
val updatedArray = array.sliceArray(1 until array.size)
assertEquals(arrayOf("Banana", "Cherry"), updatedArray)
}
📌 关键点:
sliceArray(1..lastIndex)
或1 until size
效果相同- 原数组与新数组无引用关联,修改互不影响
- 返回类型为
Array<T>
,无需转换
这是性能较好且语义清晰的方式,推荐在明确使用数组时优先考虑。
3. 使用 drop() 并转为数组
drop(n)
是 Kotlin 集合 API 中非常常用的函数,作用是丢弃前 n
个元素,返回剩余部分组成的 List
。
由于它返回的是 List
而非 Array
,所以我们需要手动调用 toTypedArray()
进行转换。
✅ 示例代码:
@Test
fun `Remove first element by using drop`() {
val array = arrayOf("Apple", "Banana", "Cherry")
val updatedArray = array.drop(1).toTypedArray()
assertEquals(arrayOf("Banana", "Cherry"), updatedArray)
}
📌 注意事项:
drop(1)
表示跳过第一个元素- ❗ 返回值是
List<T>
,必须调用toTypedArray()
才能得到Array<T>
- 如果后续逻辑对接口接受的是
Collection
或List
,可省略转换,更灵活
💡 小贴士:如果你并不执着于 Array
类型,drop(1)
是最简洁、最 idiomatic 的写法。
4. 使用 filterIndexed() 按索引过滤
当我们需要基于索引做条件判断时,filterIndexed()
就派上用场了。它可以访问每个元素的索引和值,然后根据条件决定是否保留。
要移除第一个元素,只需排除索引为 0
的项即可。
✅ 示例代码:
@Test
fun `Remove first element by using filterIndexed`() {
val array = arrayOf("Apple", "Banana", "Cherry")
val updatedArray = array.filterIndexed { index, _ -> index != 0 }.toTypedArray()
assertEquals(arrayOf("Banana", "Cherry"), updatedArray)
}
📌 特点分析:
- ✅ 灵活性高,适合复杂条件筛选
- ❌ 性能略低,因为遍历了所有元素
- ❌ 同样返回
List
,需手动转回Array
🚨 踩坑提醒:虽然功能正确,但对于简单“去首元素”这种需求来说有点杀鸡用牛刀,除非你同时还有其他过滤逻辑,否则不建议首选此方式。
5. 总结
方法 | 是否返回 Array | 是否需转换 | 推荐程度 |
---|---|---|---|
sliceArray() |
✅ 是 | ❌ 否 | ⭐⭐⭐⭐☆ |
drop() |
❌ 否(List) | ✅ 是 | ⭐⭐⭐⭐⭐ |
filterIndexed() |
❌ 否 | ✅ 是 | ⭐⭐☆☆☆ |
📌 最终建议:
- 若坚持使用
Array
→ 优先选sliceArray()
- 若接受
List
或可转换 → 首选drop(1)
,简洁又高效 - 复杂逻辑才考虑
filterIndexed()
所有示例代码均已上传至 GitHub:https://github.com/Baeldung/kotlin-tutorials/tree/master/core-kotlin-modules/core-kotlin-arrays-2
合理选择方法不仅能提升代码可读性,也能减少不必要的对象创建和性能损耗。希望这篇文章帮你理清思路,下次遇到类似问题不再纠结。