Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Scala

Scala

What is Scala?

  • Scala stands for Scalable language
  • Created by Martin Odersky
  • Started in 2001, first released in 2004
  • Runs on JVM, the Java Virtual Machine

Install Scala

  • On Ubuntu
apt install scala

Editors

Everything is an object

Check if Java is installed

java -version
openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment (build 11.0.10+9-Ubuntu-0ubuntu1.20.10)
OpenJDK 64-Bit Server VM (build 11.0.10+9-Ubuntu-0ubuntu1.20.10, mixed mode, sharing)

Scala in Docker

docker build -t scala .
docker run --rm -it -v$(pwd):/opt scala
# java -version
openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment (build 11.0.10+9-Ubuntu-0ubuntu1.20.10)
OpenJDK 64-Bit Server VM (build 11.0.10+9-Ubuntu-0ubuntu1.20.10, mixed mode, sharing)
# scala -version
Scala code runner version 2.11.12 -- Copyright 2002-2017, LAMP/EPFL

REPL

  • REPL = Read Evaluate Print Loop
$ scala
scala> 23 + 19
res0: Int = 42

scala> :quit
:help

Scala Syntax

  • Semicolons (;) are optional at the end of the statement

Hello World in Scala

object HelloWorld {
    def main(args:Array[String]) {
        println("Hello World!")
    }
}

Run Hello World in the REPL

$ scala
scala> :load Hello.scala
scala> Hello.main(null)
scala> Hello.main(Array())
$ scalac  HelloWorld.scala
$ scala   HelloWorld
Hello World!
object HelloName {
    def main(args:Array[String]) {
        val name:String = args(0)
        println("Hello " + name + "!")
    }
}

Run (Shell script)

{% embed include file="src/examples/run.sh)

Hello Name (command line parameters)

$ scalac HelloName.scala
$ scala HelloName Foo
Hello Foo!

var vs val

val creates an immutable object. var create mutable object.

val is immutable

object ValIsImmutable {
    def main(args:Array[String]) {
        val counter:Int = 0
        println(counter)
        counter = 1
        println(counter)
    }
}
ValIsImmutable.scala:5: error: reassignment to val
        counter = 1
                ^
one error found

var is immutable

object VarIsMutable {
    def main(args:Array[String]) {
        var counter:Int = 0
        println(counter)
        counter = 1
        println(counter)
    }
}
0
1

Concatenate strings

object ConcatenateStrings {
    def main(args:Array[String]) {
        val first:String = args(0)
        val second:String = args(1)
        println(first + second)
    }
}

Add Numbers (convert string to int)

  • toInt
object AddNumbers {
    def main(args:Array[String]) {
        val first:Int = args(0).toInt
        val second:Int = args(1).toInt
        println(first + second)
    }
}

Run with sbt

  • Create directory structure:
hello-world/
├── build.sbt
├── project
│   └── build.properties
└── src
    └── main
        └── scala
            └── Main.scala
object Hello {
    def main(args:Array[String]) {
        //val name:String = args(0)
        //println("Hello " + name + "!!")
        println("Hello World!")
    }
}

Comments

// Single line
/*
   Multi line
*/

Scala While loop

object WhileLoop {
    def main(args:Array[String]) {
        var cnt = 1
        while (cnt < 10) {
            cnt += 1
            println(cnt)
        }
        println("done")
    }
}

Scala For loop

object ForLoop {
    def main(args:Array[String]) {
        val planets = List("Mercury", "Venus", "Earth", "Mars")
        for(name <- planets) println(name)
        for(name <- planets) {
           println(name)
        }
    }
}
object ForLoopRange {
    def main(args:Array[String]) {
        for(i <- 10 to 1 by -1) {
           println(i)
        }
    }
}

Scala show dates

import java.util.Date
import java.util.DateFormat
object PrintDate {
  def main(args: Array[String]) {
    val now = new Date
    println(now)
  }
}

More

  • Lengths of array

  • Left facing arrow <-

object Names {
    def main(args:Array[String]) {
        val names = List("Foo", "Bar")
        //List <String> names = new ArrayList<String>()
        println(names)
        //names.add("Zorg")
        //println(names)
    }
}
object Try {
    def main(args:Array[String]) {
        var counter:Int = 0
        println(counter)
        counter = 1
    }
}