kotlin函数中的可变参数

75 阅读2分钟

在 Kotlin 中,可变参数(Variable Arguments)允许函数接收数量可变的参数,语法上通过 vararg 关键字声明。以下是关于 Kotlin 可变参数的详细说明:

1. 基本用法

在函数参数前添加 vararg 关键字,即可将该参数声明为可变参数,函数内部可将其视为数组(Array)使用。

kotlin

// 定义一个接收可变参数的函数
fun printNumbers(vararg numbers: Int) {
    // 可变参数在函数内部会被当作 Array<Int> 处理
    for (num in numbers) {
        print("$num ")
    }
    println()
}

// 调用函数时,可传入任意数量的参数(包括 0 个)
fun main() {
    printNumbers(1, 2, 3)   // 输出:1 2 3 
    printNumbers(10, 20)    // 输出:10 20 
    printNumbers()          // 输出空行(无参数)
}

2. 可变参数的位置

  • 一个函数只能有一个可变参数
  • 可变参数可以放在参数列表的任意位置,但通常建议放在最后(方便调用时省略参数名)。

kotlin

// 可变参数在中间(调用时需显式指定后续参数名)
fun example(str: String, vararg nums: Int, flag: Boolean) {
    println("str: $str, nums: ${nums.joinToString()}, flag: $flag")
}

fun main() {
    // 可变参数后有其他参数时,必须显式指定参数名
    example("test", 1, 2, 3, flag = true) 
    // 输出:str: test, nums: 1, 2, 3, flag: true
}

3. 传递数组给可变参数

如果已有一个数组,想将其元素作为可变参数传递,需使用扩展运算符 * (也称 “展开运算符”):

kotlin

fun sum(vararg numbers: Int): Int {
    return numbers.sum()
}

fun main() {
    val arr = intArrayOf(1, 2, 3, 4)
    // 使用 * 展开数组,将元素作为可变参数传递
    val total = sum(*arr) 
    println(total) // 输出:10
}

4. 与 Java 可变参数的区别

  • Kotlin 可变参数用 vararg 声明,Java 用 ... 声明。
  • Kotlin 调用 Java 可变参数函数时,可直接传递数组(无需展开);但 Java 调用 Kotlin 可变参数函数时,需通过 toArray() 转换。
  • Kotlin 可变参数在函数内部是 Array 类型,Java 则是数组类型(如 int[])。

5. 注意事项

  • 可变参数可以接收 0 个或多个参数,灵活性高。
  • 若函数同时有可变参数和其他参数,建议将可变参数放在最后,避免调用时必须显式指定参数名。
  • 扩展运算符 * 仅用于将数组 “展开” 为可变参数,不能用于非数组类型。

通过可变参数,可简化需要处理不定数量参数的场景(如工具类函数、日志打印等)。