3.15. Working with a List in a Match Expression

Problem

You know that a List data structure is a little different than other collection data structures. It’s built from cons cells and ends in a Nil element. You want to use this to your advantage when working with a match expression, such as when writing a recursive function.

Solution

You can create a List like this:

val x = List(1, 2, 3)

or like this, using cons cells and a Nil element:

val y = 1 :: 2 :: 3 :: Nil

When writing a recursive algorithm, you can take advantage of the fact that the last element in a List is a Nil object. For instance, in the following listToString method, if the current element is not Nil, the method is called recursively with the remainder of the List, but if the current element is Nil, the recursive calls are stopped and an empty String is returned, at which point the recursive calls unwind:

def listToString(list: List[String]): String = list match {
  case s :: rest => s + " " + listToString(rest)
  case Nil => ""
}

Running this example in the REPL yields the following result:

scala> val fruits = "Apples" :: "Bananas" :: "Oranges" :: Nil
fruits: List[java.lang.String] = List(Apples, Bananas, Oranges)

scala> listToString(fruits)
res0: String = "Apples Bananas Oranges "

The same approach of (a) handling the Nil condition and (b) handling the remainder of the List can be used when dealing with a List of other types:

def sum(list: List[Int]): Int = list match {
  case Nil => 1
  case n :: rest => n + sum(rest)
}

def multiply ...

Get Scala Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.