By Alvin Alexander. Last updated: February 3, 2024
This post contains a collection of Scala control structures examples. I initially created most of these in the process of writing the Scala Cookbook. Unlike the Cookbook, I don’t describe them much here, I just show the examples, mostly as a reference for myself (and anyone else that can benefit from them).
if/then control structures:
Here are some examples of the Scala if/then control structure:
if (a == b) doSomething()
if (a == b) doSomething() else doSomethingElse()
if (a == b) {
doSomething()
} else {
doSomethingElse()
}
if (test) doA
else if (test) doB
else if (test) doC
else doD
// equality operators
x < y
x > y
x == y
x != y
x >= y
x <= y
&&
||
Because if/then returns a value, you can use it like a Java ternary operator:
// using 'if' like a ternary operator val absValue = if (a < 0) -a else a // ternary println(if (i == 0) "a" else "b") // in println hash = hash * prime + (if (name == null) 0 else name.hashCode) // in equation def abs(x: Int) = if (x >= 0) x else -x // as a method body
while loop examples
var i = 0
while (i < array.length) {
println(array(i))
i += 1
}
while (hungry) {
println("Me hungry")
hungry = getHungerStatus
}
for loop examples
// simple for loops
for (arg <- args) println(arg)
for (i <- 0 to 5) println(i)
for (i <- 0 to 10 by 2) println(i)
// for loop with multiple counters:
scala> for (i <- 1 to 2; j <- 1 to 2) printf("i = %d, j = %d\n", i, j)
i = 1, j = 1
i = 1, j = 2
i = 2, j = 1
i = 2, j = 2
// print all even numbers by adding a 'guard'
scala> for (i <- 1 to 10 if i % 2 == 0) println(i)
2
4
6
8
10
// multiple guards
for {
file <- files
if passesFilter1(file) // guard
if passesFilter2(file) // guard
} doSomething(file)
// for loop with guard and yield
for {
file <- files
if hasSoundFileExtension(file)
if !soundFileIsLong(file)
} yield file
// more for loops with 'yield'
val a = Array("apple", "banana", "orange") // Array(apple, banana, orange)
val newArray = for (e <- a) yield e.toUpperCase // Array(APPLE, BANANA, ORANGE)
val a = Array(1, 2, 3, 4, 5) // Array(1, 2, 3, 4, 5)
for (e <- a) yield e // Array(1, 2, 3, 4, 5)
(e <- a) yield e * 2 // Array(2, 4, 6, 8, 10)
for (e <- a) yield e % 2 // Array(1, 0, 1, 0, 1)
for (e <- a if e > 2) yield e // Array(3, 4, 5)
match/case examples
i match {
case 1 => println("January")
case 2 => println("February")
case 3 => println("March")
case 4 => println("April")
case 5 => println("May")
case 6 => println("June")
case 7 => println("July")
case 8 => println("August")
case 9 => println("September")
case 10 => println("October")
case 11 => println("November")
case 12 => println("December")
// catch the default with a variable so you can print it
case whoa => println("Unexpected case: " + whoa.toString)
}
// assign the match result to a value
val month = i match {
case 1 => "January"
case 2 => "February"
case 3 => "March"
case 4 => "April"
case 5 => "May"
case 6 => "June"
case 7 => "July"
case 8 => "August"
case 9 => "September"
case 10 => "October"
case 11 => "November"
case 12 => "December"
case _ => "Invalid month" // the default, catch-all
}
match is incredibly flexible:
def getClassAsString(x: Any):String = x match {
case s: String => s + " is a String"
case i: Int => "Int"
case f: Float => "Float"
case l: List[_] => "List"
case p: Person => "Person"
case _ => "Unknown"
}
// multiple int values per case
val evenOrOdd = i match {
case 1 | 3 | 5 | 7 | 9 => println("odd")
case 2 | 4 | 6 | 8 | 10 => println("even")
}
// multiple string values per case
val cmd = "stop"
cmd match {
case "start" | "go" => println("starting")
case "stop" | "quit" | "exit" => println("stopping")
case _ => println("doing nothing")
}
// match as the body of a method
def istrue(a: Any) = a match {
case 0 | "" => false
case _ => true
}
// assign the 'default' case to a variable
i match {
case 0 => println("1")
case 1 => println("2")
case whoa => println("You gave me: " + whoa)
}
// use 'if' expressions in case statements
i match {
case a if 0 to 9 contains a => println("0-9 range: " + a)
case b if 10 to 19 contains b => println("10-19 range: " + a)
case c if 20 to 29 contains c => println("20-29 range: " + a)
case _ => println("Hmmm...")
}
count match {
case x if x == 1 => println("one, a lonely number")
case x if (x == 2 || x == 3) => println(x)
case _ => println("some other value")
}
// reference class fields in your 'if' statements:
stock match {
case x if (x.symbol == "XYZ" && x.price < 20) => buy(x)
case x if (x.symbol == "XYZ" && x.price > 50) => sell(x)
case x => doNothing(x)
}
// extract fields from case classes and use those in your guards ('if' statements)
def speak(p: Person) = p match {
case Person(name) if name == "Fred" => println("Yubba dubbo doo")
case Person(name) if name == "Bam Bam" => println("Bam bam!")
case _ => println("Huh?")
}
// using a List in a match expression
def sumAll(list: List[Int]): Int = list match {
case Nil => 1
case n :: rest => n + sumAll(rest)
}
// Option/Some/None in a match
toInt(someString) match {
case Some(i) => println(i)
case None => println("That didn't work.")
}
Scala try/catch syntax
try {
openAndReadAFile(filename)
} catch {
case e: FileNotFoundException => println("Couldn't find that file.")
case e: IOException => println("Had an IOException trying to read that file")
case _ => println("Got some other kind of exception")
}
Summary
I hope this collection of Scala control structure examples (if/then/else, while, match/case, try/catch) has been helpful. I’ll try to keep adding more examples here as time goes by.

