How to add elements to a List in Scala (List, ListBuffer)

Scala List FAQ: How do I add elements to a Scala List?

This is actually a trick question, because you can't add elements to a Scala List; it's an immutable data structure, like a Java String.

Prepending elements to Scala Lists

One thing you can do when working with a Scala List is to create a new List from an existing List. This sort of thing is done often in functional programming in Scala, and the general approach looks like this:

scala> val p1 = List("Kim")
p1: List[String] = List(Kim)

scala> val p2 = "Julia" :: p1
p2: List[String] = List(Julia, Kim)

scala> val p3 = "Judi" :: p2
p3: List[String] = List(Judi, Julia, Kim)

Those examples show how to create a series of lists. The initial list named p1 contains one string, then p2 contains two strings, and finally p3 contains three strings. Prepending elements like this is exactly how the Scala List class is intended to be used.

While that approach looks cumbersome in a small example, it makes sense in larger, real-world code. You can see more/better examples of this approach in my tutorial, Scala List class examples.

Use a ListBuffer when you want a “List” you can modify

If you want to use a Scala sequence that has many characteristics of a List and is also mutable — i.e., you can add and remove elements in it — the correct approach is to use the Scala ListBuffer class instead, like this:

import scala.collection.mutable.ListBuffer

var fruits = new ListBuffer[String]()
fruits += "Apple"
fruits += "Banana"
fruits += "Orange"

Then convert it to a List if/when you need to:

val fruitsList = fruits.toList

Scala REPL example

Here's what this List and ListBuffer example looks like using the Scala command line (REPL):

scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer

scala> var fruits = new ListBuffer[String]()
fruits: scala.collection.mutable.ListBuffer[String] = ListBuffer()

scala> fruits += "Apple"
res0: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple)

scala> fruits += "Banana"
res1: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple, Banana)

scala> fruits += "Orange"
res2: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple, Banana, Orange)

scala> val fruitsList = fruits.toList
fruitsList: List[String] = List(Apple, Banana, Orange)

Note: Depending on your needs, it may be better to use an ArrayBuffer rather than a ListBuffer. See my Scala Cookbook Make the ArrayBuffer Your Default Mutable, Indexed Sequence tutorial for more information.

More functional ways to work with Scala lists

Depending on your needs, there are other, "more functional" ways to work with Scala lists, and I work through some of those in my Scala List examples. But for my needs today, I just wanted to work with a Scala List like I'd work with a Java List (ArrayList, LinkedList), and this approach suits me.