Functions: varargs Parameters

When creating a function, you can declare that a function parameter can be repeated. We call this a varargs parameter. There are two rules for varargs parameters:

  • Can only have one varargs parameters per input group
  • It must be the last parameter

Define a varargs parameter by adding a * symbol after the input parameter type.

Examples

// [1] define a function with a varargs parameter
def addAll(ints: Int*): Int = 
    ints.sum

// [2] you can call the function in all these different ways
addAll()
addAll(1)
addAll(1, 2, 3)

Other examples

This function takes a variable number of String parameters:

// varargs
@main def hello(names: String*): Unit =
    names.foreach(name => println(s"Hello, $name"))

This one won’t compile because I attempt to use it before another parameter; this violates the rules:

def printAll(strings: String*, i: Int): Unit = 
    strings.foreach(println)

Advanced: Use _* to adapt a sequence

I didn’t show it in the video, but when you want to pass a sequence into a function that has a varargs parameter, you need to adapt the sequence using the special _* characters:

// a varargs function:
def addAll(ints: Int*): Int = 
    ints.sum

// attempt to pass a List into the function:
val xs = List(1, 2, 3)
addAll(xs)    // fails

// solution: convert the List; this works:
addAll(xs: _*)

I like to think of _* as being like the “splat” character (*) in UNIX and Linux systems.