3. The basics…
• Scala stands for ‘scalable language’
• Scala runs on the Java Virtual Machine ( JVM)
• Created by Martin Odersky (EPFL)
• he previously created the Pizza language
with Philip Wadler (now at Edinburgh
University)
• …then GJ (Generic Java) that became
Java Generics in the official Java 5.0
release for which he apologises!
4. How long has it been
around?
• Scala 1.0 appeared in 2003
• Scala 2.0 appeared in 2006
• Scala 2.7.7 is the current stable release
• Scala 2.8 beta 1 is due for release any day now!
5. “If I were to pick a language to
use today other than Java, it
would be Scala”
James Gosling
6. Try this at home!
• Scala home: http://www.scala-lang.org/
• Downloadable for Mac, Linux & Windows
• Shell interpreter: scala
• Compilers: scalac and fsc
• Documentation generator scaladoc
• Plugins for Eclipse, Netbeans, IntelliJ
7. Hello World!
->scala
Welcome to Scala version 2.7.7.final (Java HotSpot
(TM) 64-Bit Server VM, Java 1.6.0_17).
Type in expressions to have them evaluated.
Type :help for more information.
scala> def main { println("Hello World!") }
main: Unit
scala> main
Hello World!
8. Build tools +
• Maven Plugin (no endorsement implied)—http://
scala-tools.org/mvnsites/maven-scala-plugin/
• simple-build-tool—http://code.google.com/p/
simple-build-tool/
• Apache Ant tasks for Scala—http://www.scala-
lang.org/node/98
• Apache Buildr—http://buildr.apache.org/
• JavaRebel—http://www.zeroturnaround.com/
9. How does Scala differ
from Java?
• Pattern matching and
• Object oriented and Extractors
functional • Actors
• Everything is an object • XML literals
• First-class functions • Properties
(‘closures’)
• Case classes
• Singleton objects
• Lazy evaluation
• Mixin composition with
Traits • Parser combinators
• Tuples
13. Static Typing in Scala
scala> def calc(x:Int) = ((x + 2) * 2)
calc: (x: Int)Int
scala> calc(1)
res0: Int = 6
scala> calc("1")
<console>:6: error: type mismatch;
found : java.lang.String("1")
required: Int
calc("1")
^
14. Static Typing in Scala
scala> def calc(x:Any) = x match {
| case y:Int => ((y + 2) * 2)
| case y:String => ((y + 2) * 2)
| }
calc: (x: Any)Any
scala> calc(1)
res1: Any = 6
scala> calc("1")
res2: Any = 1212
15. Type inference
va
Date x = new Date();
Ja
a
val x = new Date
al
Sc
x: java.util.Date = Tue Jan 12 01:04:42 GMT 2010
va
Ja
List<Integer> y = new ArrayList<Integer>();
Collections.addAll(y,1,2,3);
a
al
val y = List(1,2,3)
Sc
y: List[Int] = List(1, 2, 3)
16. Everything is an object
“Answer = ” + 6 * 4
“Answer = ”.+(6.*(4))
17. Concise / first-class functions
va
String s = "Which are the longer words";
Ja
Array<String> words = s.split(‘ ’);
ArrayList<String> longWords = new ArrayList<String>();
for (w in words) {
if (w.size() > 3) longWords.add(w);
}
System.out.println(longWords);
a
al
val s = "Which are the longer words"
Sc
val longWords = s.split(‘ ’).filter( _.size > 3)
println(longWords)
18. Pattern matching
scala> val words = List("three","words","first")
words: List[java.lang.String] = List(two, words, first)
scala> val List(x, y, z) = words.sort( (a,b) => a < b )
x: java.lang.String = first
y: java.lang.String = three
z: java.lang.String = words
scala> val (x :: _) = words.sort( _ < _ )
x: java.lang.String = first
19. Properties, getters and setters
va
public class Rect {
Ja
private final int width;
private final int height;
public Rect(int width, int height) {
this.width = width;
a
this.height = height;
al
}
Sc
case class Rect(width:Int, height:Int) {
public int getWidth() {
return this.width; def area = width * height
} }
public int getHeight() {
return this.height;
val r = Rect(2,4)
}
public int area() { println(r.area)
return this.width * this.height;
}
}
…
Rect r = new Rect(2,4);
System.out.println(r.area());
20. Regular expressions and
extractors
val Email = """([A-Za-z0-9._%-]+)@([A-Za-z0-9.-]+.[A-Za-z]{2,4})""".r
val Telephone = """+(d+) ([d ]+)""".r
val inputs = List("+44 2423 1313", "test@gmail.co.uk", "Fred Bloggs")
inputs.foreach{ input =>
val output = input match {
case Email(user, domain) => "Email => User:" + user + " Domain:" + domain
case Telephone(country, code) => "Telephone => Country:" + country + " Code:" + code
case _ => "Unknown"
}
println(output)
}
Telephone => Country:44 Code:2423 1313
Email => User:test Domain:gmail.co.uk
Unknown
21. XML literals and parsing
val xml = <item>
<title>Lift Version 1.0 Released</title>
<link>http://www.scala-lang.org/node/1011</link>
<description>Twelve is > six</description>
<comments>http://www.scala-lang.org/node/1011#comments</comments>
<category domain="http://www.scala-lang.org/taxonomy/term/15">Featured</category>
<pubDate>Fri, 27 Feb 2009 10:02:55 +0000</pubDate>
<dc:creator>bagwell</dc:creator>
<guid isPermaLink="false">1011 at http://www.scala-lang.org</guid>
</item>
xml: scala.xml.Elem = …
(xml "description").text
res1: String = Twelve is > six
(xml "category" "@domain" ).text
res2: String = http://www.scala-lang.org/taxonomy/term/15
22. Further XML file parsing +
import xml.XML
val loadnode = XML.loadFile(“input.xml”)
println(“Number of items = ” + (loadnode
“item”).toList.size)
Number of items = 2
val authors = (loadnode “item” “creator”).toList.map
(_.text ).toSet.toList.sort(_<_)
println(“Authors were: ” + authors.mkString(“, ”))
Authors were: admin, bagwell
23. Commercial users of Scala
• Twitter—Scala back end Ruby front end
• LinkedIn
• Foursquare—Scala and Lift
• Siemens—Scala and Lift
• SAP
• EDF
• Sony Pictures (ImageWorks)
• Nature Magazine
• …and Google