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
不过,使用可变参数时需要注意以下几点:
- 可变参数必须是方法的 最后一个参数
- 所有可变参数的类型必须一致(比如不能混用
Int
和String
) - 一个方法最多只能有一个可变参数
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 更加简洁优雅 ✅