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>
  • 如果后续逻辑对接口接受的是 CollectionList,可省略转换,更灵活

💡 小贴士:如果你并不执着于 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

合理选择方法不仅能提升代码可读性,也能减少不必要的对象创建和性能损耗。希望这篇文章帮你理清思路,下次遇到类似问题不再纠结。


原始标题:Removing the First Element From an Array in Kotlin