Scala List FAQ: How do I add elements to a Scala
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
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, 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
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 (
LinkedList), and this approach suits me.