If I were to pick a language to use on the JVM today other than Java, it would be Scala. –  James Gosling, creator of Java http://www.adam-bien.com/roller/abien/entry/java_net_javaone_which_programming Scala, it must be stated, is the current heir apparent to the Java throne. No other language on the JVM seems as capable of being a "replacement for Java" as Scala, and the momentum behind Scala is now unquestionable. –  Charlies Nutter, JRuby lead http://blog.headius.com/2009/04/future-part-one.html My tip though for the long term replacement of javac is Scala. I'm very impressed with it! I can honestly say if someone had shown me the Programming in Scala book […] back in 2003 I'd probably have never created Groovy. –  James Strachan, creator of Groovy http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html
Agenda Background and motivation
Intro to Scala Basic syntax
Pattern matching
Functions
Classes and traits <break />
Practical Scala
About us Alf Kristian Støyle and Fredrik Vraalsen
Java developers with 6 and 9 years experience
Scala enthusiasts since 2008
Developed SubmitIT for JavaZone
Alf worked on Scala application for Kommuneforlaget
Held 4 Scala training courses for 60+ participants
 
public   class  Person {  private   int   age ; private  String  name ; public  Person( int  age, String name) { this . age  = age; this . name  = name; } public   int  getAge() {  return   this . age ;  } public   void  setAge( int  age) {  this . age  = age;  } public  String getName() {  return   this . name ;  } public   void  setName(String name) {  this . name  = name; } } class   Person ( var   age :  Int ,   var   name :  String )
List<Person> persons =  ...  List<Person> adults =  new  LinkedList<Person>(); List<Person> kids =  new  LinkedList<Person>(); for  (Person person : persons) { if  (person.getAge() < 18) { kids.add(person); }  else  { adults.add(person); } } val   persons :  List [ Person ] =  ... val  ( kids ,  adults ) =  persons . partition (_. age   <  18)
using ( new   BufferedReader ( new   FileReader ( &quot;f.txt&quot; ))) { reader  =>  println ( reader . readLine() ) } BufferedReader reader =  null ; try  { reader =  new  BufferedReader( new  FileReader( &quot;f.txt&quot; )); System. out .println(reader.readLine()); }  finally  { if  (reader !=  null ) { try  { reader.close(); }  catch  (IOException e) { // Exception on close, ignore } } }
Scala Object oriented and functional
Statically typed
Java compatible Compiles to Java bytecode
Existing libraries/frameworks Better Java
;
public   class  Person {  private   int   age ; private  String  name ; public  Person( int  age, String name) { this . age  = age; this . name  = name; } public   int  getAge() {  return   this . age ;  } public   void  setAge( int  age) {  this . age  = age;  } public  String getName() {  return   this . name ;  } public   void  setName(String name) {  this . name  = name; } }
public   class  Person {  private   int   age private  String  name public  Person( int  age, String name) { this . age  = age this . name  = name } public   int  getAge() {  return   this . age   } public   void  setAge( int  age) {  this . age  = age  } public  String getName() {  return   this . name   } public   void  setName(String name) {  this . name  = name } }
Variables var   i :  Int  = 42
Variables var   i  = 42 i  = 3 i  =  &quot;Hello world!&quot; // compile error
Values val   i  = 42 i  = 3 // compile error
Methods def   sum ( a :  Int ,  b :  Int ):  Int  = { return   a   +   b }
Methods def   sum ( a :  Int ,  b :  Int ):  Int  = { a   +   b }
Methods def   sum ( a :  Int ,  b :  Int ) = { a   +   b }
Methods def   sum ( a :  Int ,  b :  Int ) =  a   +   b
Methods def   sayHello ( name :  String ) { println ( &quot;Hello, &quot;   +   name ) }
Methods &quot;apple&quot; . charAt (0) &quot;apple&quot;   charAt  0 1.0.+(2.0) 1.0 + 2.0
Collections val   list   =  List ( &quot;apple&quot; ,  &quot;orange&quot; ,  &quot;banana&quot; ) val   map   =  Map (1  ->   &quot;one&quot; , 2  ->   &quot;two&quot; ) val   array  =  Array (1, 2, 3, 4, 5) list (1) // orange map (2) // two array (3) // 4
myObject   match  { case  1 =>  println ( &quot;First&quot; ) case  2 =>  println ( &quot;Second&quot; ) case  _ =>  println ( &quot;Unknown&quot; ) } Pattern matching
myObject   match  { case   i :  Int  =>  println ( &quot;Found number &quot;  +  i ) case   s :  String  =>  println ( &quot;Found text &quot;  +  s ) case  _ =>  println ( &quot;Unknown&quot; ) } Pattern matching
val   email  =  &quot;&quot;&quot; (.+) @ (.+) &quot;&quot;&quot; . r &quot; scala @ java.no &quot;   match  { case   email ( name ,  domain ) =>  println ( &quot;User &quot;   +   name   +   &quot; at &quot;   +   domain ) case   x  =>  println ( x   +   &quot; is not an email&quot; ) } Pattern matching
val   numbers  =  List (1, 2, 3) val   secondNumber  =  numbers   match  { case   List (_,  i , _*) =>  Some ( i ) case  _ =>  None } =>  secondNumber :  Option [ Int ] =  Some (2) Pattern matching
Functions Predicate <Integer> even =  new   Predicate <Integer>() { @ Override public   boolean  apply(Integer i) { return  i % 2 == 0; } }; List<Integer> numbers = …  // 1, 2, 3, 4 Iterable<Integer> evenNums = Iterables .filter(numbers, even); => [2, 4] Google collections:
Functions val   even  = ( i :  Int ) =>  i   %  2  ==  0 val   numbers  =  List (1, 2, 3, 4) val   evenNums  =  numbers . filter ( even ) => List(2, 4) Scala collections:
Functions val   numbers  =  List (1, 2, 3, 4) val   evenNums  =  numbers . filter (( i :  Int ) =>  i   %  2  ==  0) => List(2, 4) Scala collections:
Functions val   numbers  =  List (1, 2, 3, 4) val   evenNums  =  numbers . filter ( i  =>  i   %  2  ==  0) => List(2, 4) Scala collections:
Functions val   numbers  =  List (1, 2, 3, 4) val   evenNums  =  numbers . filter (_ % 2 == 0) => List(2, 4) Scala collections:
Functions Predicate <Integer> even =  new   Predicate <Integer>() { @ Override public   boolean  apply(Integer i) { return  i % 2 == 0; } }; val   numbers  =  List (1, 2, 3, 4) val   evenNums  =  numbers . filter (_ % 2 == 0) => List(2, 4) Scala collections:
Functions #boolean(int) even = #(int i)(i % 2 == 0) JDK7 lambda expressions: val   even  = ( i :  Int ) =>  i   %  2  ==  0 Scala functions:
Functions Iterables.filter(numbers, #(int i)(i % 2 == 0)) JDK7 lambda expressions: numbers . filter (_ % 2 == 0) Scala functions:
Control structures return values val   numbers  =  for  ( i  <- 1  to  10)  yield   i val   res  =  if  ( cond )  x   else   y val   res2  =  try  {  x  }  catch  { …  y  }  finally  { … }
Classes and constructors class   Person ( val   age :  Int )
Classes and constructors class   Person ( val   age :  Int ) { def   this () =  this (42) var   name :  String  = _ override   def   toString  =  &quot;My name is &quot;   +   name }
Traits (= Interface + Mixin) “Multiple inheritance done right”
Implement methods
Initialized fields
Abstract methods and fields
Does not support constructors
Call to super -> strict semantics
scala.Ordered trait trait   Ordered [ A ] { def   compare ( that :  A ):  Int def   <   ( that :  A ):  Boolean  = ( this   compare   that )  <   0 def   >   ( that :  A ):  Boolean  = ( this   compare   that )  >   0 def   <=  ( that :  A ):  Boolean  = ( this   compare   that )  <=  0 def   >=  ( that :  A ):  Boolean  = ( this   compare   that )  >=  0 }
The Ordered trait class   Person ( val   age :  Int )  extends   Ordered [ Person ] { def   compare ( other :  Person ) =  this . age   -   other . age } val   person1  =  new   Person (21) val   person2  =  new   Person (31) person1  <  person2  // true person1  <=  person2 // true person1  >=  person2 // false
“Dynamic mixins” class   Person ( val   name :  String,  val   age :  Int ) { override   def   toString  =  &quot;My name is &quot;   +   name } trait   Loud  { override   def   toString  =  super . toString . toUpperCase } val   person  =  new   Person ( &quot;Fredrik&quot; , 18)  with   Loud println ( person ) => MY NAME IS FREDRIK
Just scratching the surface... Tuples
Singleton objects
Closures
For-comprehensions

Scala introduction

  • 1.
    If I wereto pick a language to use on the JVM today other than Java, it would be Scala. – James Gosling, creator of Java http://www.adam-bien.com/roller/abien/entry/java_net_javaone_which_programming Scala, it must be stated, is the current heir apparent to the Java throne. No other language on the JVM seems as capable of being a &quot;replacement for Java&quot; as Scala, and the momentum behind Scala is now unquestionable. – Charlies Nutter, JRuby lead http://blog.headius.com/2009/04/future-part-one.html My tip though for the long term replacement of javac is Scala. I'm very impressed with it! I can honestly say if someone had shown me the Programming in Scala book […] back in 2003 I'd probably have never created Groovy. – James Strachan, creator of Groovy http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html
  • 2.
  • 3.
    Intro to ScalaBasic syntax
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
    About us AlfKristian Støyle and Fredrik Vraalsen
  • 9.
    Java developers with6 and 9 years experience
  • 10.
  • 11.
  • 12.
    Alf worked onScala application for Kommuneforlaget
  • 13.
    Held 4 Scalatraining courses for 60+ participants
  • 14.
  • 15.
    public class Person { private int age ; private String name ; public Person( int age, String name) { this . age = age; this . name = name; } public int getAge() { return this . age ; } public void setAge( int age) { this . age = age; } public String getName() { return this . name ; } public void setName(String name) { this . name = name; } } class Person ( var age : Int , var name : String )
  • 16.
    List<Person> persons = ... List<Person> adults = new LinkedList<Person>(); List<Person> kids = new LinkedList<Person>(); for (Person person : persons) { if (person.getAge() < 18) { kids.add(person); } else { adults.add(person); } } val persons : List [ Person ] = ... val ( kids , adults ) = persons . partition (_. age < 18)
  • 17.
    using ( new BufferedReader ( new FileReader ( &quot;f.txt&quot; ))) { reader => println ( reader . readLine() ) } BufferedReader reader = null ; try { reader = new BufferedReader( new FileReader( &quot;f.txt&quot; )); System. out .println(reader.readLine()); } finally { if (reader != null ) { try { reader.close(); } catch (IOException e) { // Exception on close, ignore } } }
  • 18.
    Scala Object orientedand functional
  • 19.
  • 20.
    Java compatible Compilesto Java bytecode
  • 21.
  • 22.
  • 23.
    public class Person { private int age ; private String name ; public Person( int age, String name) { this . age = age; this . name = name; } public int getAge() { return this . age ; } public void setAge( int age) { this . age = age; } public String getName() { return this . name ; } public void setName(String name) { this . name = name; } }
  • 24.
    public class Person { private int age private String name public Person( int age, String name) { this . age = age this . name = name } public int getAge() { return this . age } public void setAge( int age) { this . age = age } public String getName() { return this . name } public void setName(String name) { this . name = name } }
  • 25.
    Variables var i : Int = 42
  • 26.
    Variables var i = 42 i = 3 i = &quot;Hello world!&quot; // compile error
  • 27.
    Values val i = 42 i = 3 // compile error
  • 28.
    Methods def sum ( a : Int , b : Int ): Int = { return a + b }
  • 29.
    Methods def sum ( a : Int , b : Int ): Int = { a + b }
  • 30.
    Methods def sum ( a : Int , b : Int ) = { a + b }
  • 31.
    Methods def sum ( a : Int , b : Int ) = a + b
  • 32.
    Methods def sayHello ( name : String ) { println ( &quot;Hello, &quot; + name ) }
  • 33.
    Methods &quot;apple&quot; .charAt (0) &quot;apple&quot; charAt 0 1.0.+(2.0) 1.0 + 2.0
  • 34.
    Collections val list = List ( &quot;apple&quot; , &quot;orange&quot; , &quot;banana&quot; ) val map = Map (1 -> &quot;one&quot; , 2 -> &quot;two&quot; ) val array = Array (1, 2, 3, 4, 5) list (1) // orange map (2) // two array (3) // 4
  • 35.
    myObject match { case 1 => println ( &quot;First&quot; ) case 2 => println ( &quot;Second&quot; ) case _ => println ( &quot;Unknown&quot; ) } Pattern matching
  • 36.
    myObject match { case i : Int => println ( &quot;Found number &quot; + i ) case s : String => println ( &quot;Found text &quot; + s ) case _ => println ( &quot;Unknown&quot; ) } Pattern matching
  • 37.
    val email = &quot;&quot;&quot; (.+) @ (.+) &quot;&quot;&quot; . r &quot; scala @ java.no &quot; match { case email ( name , domain ) => println ( &quot;User &quot; + name + &quot; at &quot; + domain ) case x => println ( x + &quot; is not an email&quot; ) } Pattern matching
  • 38.
    val numbers = List (1, 2, 3) val secondNumber = numbers match { case List (_, i , _*) => Some ( i ) case _ => None } => secondNumber : Option [ Int ] = Some (2) Pattern matching
  • 39.
    Functions Predicate <Integer>even = new Predicate <Integer>() { @ Override public boolean apply(Integer i) { return i % 2 == 0; } }; List<Integer> numbers = … // 1, 2, 3, 4 Iterable<Integer> evenNums = Iterables .filter(numbers, even); => [2, 4] Google collections:
  • 40.
    Functions val even = ( i : Int ) => i % 2 == 0 val numbers = List (1, 2, 3, 4) val evenNums = numbers . filter ( even ) => List(2, 4) Scala collections:
  • 41.
    Functions val numbers = List (1, 2, 3, 4) val evenNums = numbers . filter (( i : Int ) => i % 2 == 0) => List(2, 4) Scala collections:
  • 42.
    Functions val numbers = List (1, 2, 3, 4) val evenNums = numbers . filter ( i => i % 2 == 0) => List(2, 4) Scala collections:
  • 43.
    Functions val numbers = List (1, 2, 3, 4) val evenNums = numbers . filter (_ % 2 == 0) => List(2, 4) Scala collections:
  • 44.
    Functions Predicate <Integer>even = new Predicate <Integer>() { @ Override public boolean apply(Integer i) { return i % 2 == 0; } }; val numbers = List (1, 2, 3, 4) val evenNums = numbers . filter (_ % 2 == 0) => List(2, 4) Scala collections:
  • 45.
    Functions #boolean(int) even= #(int i)(i % 2 == 0) JDK7 lambda expressions: val even = ( i : Int ) => i % 2 == 0 Scala functions:
  • 46.
    Functions Iterables.filter(numbers, #(inti)(i % 2 == 0)) JDK7 lambda expressions: numbers . filter (_ % 2 == 0) Scala functions:
  • 47.
    Control structures returnvalues val numbers = for ( i <- 1 to 10) yield i val res = if ( cond ) x else y val res2 = try { x } catch { … y } finally { … }
  • 48.
    Classes and constructorsclass Person ( val age : Int )
  • 49.
    Classes and constructorsclass Person ( val age : Int ) { def this () = this (42) var name : String = _ override def toString = &quot;My name is &quot; + name }
  • 50.
    Traits (= Interface+ Mixin) “Multiple inheritance done right”
  • 51.
  • 52.
  • 53.
  • 54.
    Does not supportconstructors
  • 55.
    Call to super-> strict semantics
  • 56.
    scala.Ordered trait trait Ordered [ A ] { def compare ( that : A ): Int def < ( that : A ): Boolean = ( this compare that ) < 0 def > ( that : A ): Boolean = ( this compare that ) > 0 def <= ( that : A ): Boolean = ( this compare that ) <= 0 def >= ( that : A ): Boolean = ( this compare that ) >= 0 }
  • 57.
    The Ordered traitclass Person ( val age : Int ) extends Ordered [ Person ] { def compare ( other : Person ) = this . age - other . age } val person1 = new Person (21) val person2 = new Person (31) person1 < person2 // true person1 <= person2 // true person1 >= person2 // false
  • 58.
    “Dynamic mixins” class Person ( val name : String, val age : Int ) { override def toString = &quot;My name is &quot; + name } trait Loud { override def toString = super . toString . toUpperCase } val person = new Person ( &quot;Fredrik&quot; , 18) with Loud println ( person ) => MY NAME IS FREDRIK
  • 59.
    Just scratching thesurface... Tuples
  • 60.
  • 61.
  • 62.