1. 概述

在这篇简短的教程中,我们将介绍如何在 Scala 中使用 可变参数(Repeated Parameters) 特性。

这个语言特性并非 Scala 独有,许多其他编程语言也支持类似的功能。例如在 Java 中,它被称为 varargs,但本质上是同一个概念。

2. Scala 中的可变参数

在不支持可变参数的语言中,如果想传递多个参数给函数,通常需要手动封装成数组或列表,这有时候会带来不必要的样板代码。

2.1. 定义带可变参数的方法

✅ 在 Scala 内部,可变参数会被当作一个 数组(Array) 来处理,这个数组可以为空。因此,一旦方法接收了可变参数,我们就可以像操作数组一样处理它:

scala> def myFunction(times: Int, strings: String*): String = {
     | (strings.mkString(" ") + "\n") * times
     | }
def myFunction(times: Int, strings: String*): String

不过,使用可变参数时需要注意以下几点:

  • 可变参数必须是方法的 最后一个参数
  • 所有可变参数的类型必须一致(比如不能混用 IntString
  • 一个方法最多只能有一个可变参数

2.2. 调用带有可变参数的方法

调用我们刚才定义的方法非常直观。比如传入三个 String 参数:

scala> myFunction(3, "scala", "is", "awesome") 
val res0: String = 
"scala is awesome 
scala is awesome 
scala is awesome "

当然,也可以不传任何可变参数进去。在这种情况下,我们的方法会输出三次换行:

scala> myFunction(3)
val res1: String = "
 
 
"

2.3. 展开操作符(Splat Operator)

有时候我们已经有一个 List,但要调用的方法却需要可变参数。如果直接传入这个 List,就会报错:

scala> val lst = List("Scala", "is", "awesome")
val lst: List[String] = List(Scala, is, awesome)

scala> myFunction(3, lst)
                     ^
error: type mismatch;
found   : List[String]
required: String

这时候就需要使用 展开操作符(splat operator) :_*,把集合转换为可变参数的形式:

scala> myFunction(3, lst:_*)
val res2: String =
"Scala is awesome
Scala is awesome
Scala is awesome"

⚠️ 这个语法在 Scala 2 中是 :_*,而在 Scala 3 中已经简化为 *,不过使用方式基本一致。

3. 总结

通过这篇文章,我们了解了如何在 Scala 中使用可变参数功能。它让方法调用更加灵活,也减少了手动封装集合的样板代码。在实际开发中,合理使用可变参数可以让你的 API 更加简洁优雅 ✅


原始标题:Destructuring Declarations in Kotlin