Scala 3 — Book

Variables and Data Types

Language

This section provides a look at Scala variables and data types.

Two types of variables

When you create a new variable in Scala, you declare whether the variable is immutable or mutable:

Variable Type Description
val Creates an immutable variable—like final in Java. You should always create a variable with val, unless there’s a reason you need a mutable variable.
var Creates a mutable variable, and should only be used when a variable’s contents will change over time.

These examples show how to create val and var variables:

// immutable
val a = 0

// mutable
var b = 1

In an application, a val can’t be reassigned. You’ll cause a compiler error if you try to reassign one:

val msg = "Hello, world"
msg = "Aloha"   // "reassignment to val" error; this won’t compile

Conversely, a var can be reassigned:

var msg = "Hello, world"
msg = "Aloha"   // this compiles because a var can be reassigned

Declaring variable types

When you create a variable you can explicitly declare its type, or let the compiler infer the type:

val x: Int = 1   // explicit
val x = 1        // implicit; the compiler infers the type

The second form is known as type inference, and it’s a great way to help keep this type of code concise. The Scala compiler can usually infer the data type for you, as shown in the output of these REPL examples:

scala> val x = 1
val x: Int = 1

scala> val s = "a string"
val s: String = a string

scala> val nums = List(1, 2, 3)
val nums: List[Int] = List(1, 2, 3)

You can always explicitly declare a variable’s type if you prefer, but in simple assignments like these it isn’t necessary:

val x: Int = 1
val s: String = "a string"
val p: Person = Person("Richard")

Notice that with this approach, the code feels more verbose than necessary.

Built-in data types

Scala comes with the standard numeric data types you’d expect, and they’re all full-blown instances of classes. In Scala, everything is an object.

These examples show how to declare variables of the numeric types:

val b: Byte = 1
val i: Int = 1
val l: Long = 1
val s: Short = 1
val d: Double = 2.0
val f: Float = 3.0

Because Int and Double are the default numeric types, you typically create them without explicitly declaring the data type:

val i = 123   // defaults to Int
val j = 1.0   // defaults to Double

In your code you can also append the characters L, D, and F (and their lowercase equivalents) to numbers to specify that they are Long, Double, or Float values:

val x = 1_000L   // val x: Long = 1000
val y = 2.2D     // val y: Double = 2.2
val z = 3.3F     // val z: Float = 3.3

When you need really large numbers, use the BigInt and BigDecimal types:

var a = BigInt(1_234_567_890_987_654_321L)
var b = BigDecimal(123_456.789)

Where Double and Float are approximate decimal numbers, BigDecimal is used for precise arithmetic.

Scala also has String and Char data types:

val name = "Bill"   // String
val c = 'a'         // Char

Strings

Scala strings are similar to Java strings, but they have two great additional features:

  • They support string interpolation
  • It’s easy to create multiline strings

String interpolation

String interpolation provides a very readable way to use variables inside strings. For instance, given these three variables:

val firstName = "John"
val mi = 'C'
val lastName = "Doe"

You can combine those variables in a string like this:

println(s"Name: $firstName $mi $lastName")   // "Name: John C Doe"

Just precede the string with the letter s, and then put a $ symbol before your variable names inside the string.

To embed arbitrary expressions inside a string, enclose them in curly braces:

println(s"2 + 2 = ${2 + 2}")   // prints "2 + 2 = 4"

val x = -1
println(s"x.abs = ${x.abs}")   // prints "x.abs = 1"

The s that you place before the string is just one possible interpolator. If you use an f instead of an s, you can use printf-style formatting syntax in the string. Furthermore, a string interpolator is just a special method and it is possible to define your own. For instance, some database libraries define the very powerful sql interpolator.

Multiline strings

Multiline strings are created by including the string inside three double-quotes:

val quote = """The essence of Scala:
               Fusion of functional and object-oriented
               programming in a typed setting."""

For more details on string interpolators and multiline strings, see the “First Look at Types” chapter.

Contributors to this page: