0
Peter PilgrimOracle Java ChampionINTRODUCTION INTO SCALA THE OBJECT‐FUNCTIONAL PROGRAMMING LANGUAGE                       ...
Blog: www.XeNoNiQUe.co.uk/blog/ACCU: Member since 1993Education: London South Bank UniversityLanguages: Scala, Groovy, Jav...
“If I were a pick a language to use today other than Java, it would be Scala”                                 James Goslin...
Headline News “More and more programmers are going to need to  understand functional programming at a productive  level. E...
Demo  XeNoNiQUe.co.uk (c) 2011   4/14/2011   5
Today’s Agenda Classes and Companion Objects Function Objects Case classes and Pattern matching Traits, Mix‐ins and Compos...
The Basics        XeNoNiQUe.co.uk (c) 2011   4/14/2011   7
Scalable Language              Very Bright FutureFunctional                             Purely Object Oriented     Statica...
Martin Odersky ‐ Language Designer                  XeNoNiQUe.co.uk (c) 2011   4/14/2011   9
A Brief History of Scala             Make Java Better  1996 – 2000: Pizza, GJ and javac            Make a Better Java 2003...
A Java Classpublic class Person {  public final String firstName, lastName;  public final float height;  public final int ...
Equivalent Scala classclass   Person (  val   firstName: String  val   lastName: String,  val   height: Float,  val   age:...
Filtering Data with Javaimport java.util.ArrayList;Person[] people = getPeople();Person[] tallFolk;Person[] shortFolk;{   ...
And in Scalaval people: Array[Person] = getPeople()// Type inferenceval ( smallFolk, bigFolk ) =  people partition ( _.hei...
Semicolon is optional            XeNoNiQUe.co.uk (c) 2011   4/14/2011   15
Vals                                 and                                  VarsXeNoNiQUe.co.uk (c) 2011   4/14/2011   16
VariablesTwo Types of variables:  val     a immutable variable  var     a re‐assignable variableval s1 = “Purple Haze” // ...
Variables Type Inferencesval s3: String = “Purple Haze”val f1: Double = 3.141596527val fruit = List(“orange”,”apple”)  // ...
Scopeval s1 = “Purple   Haze”{   val s1 = “Day   Tripper”   println( s1 )   // "Day Tripper"}println( s1 ) //   "Purple Ha...
Scala IdentifiersFour forms of Scala identifiers  Alphanumeric: A letter followed by a sequence of   letters or digits    ...
Basic Scala Literals Integer:       1, 882, ‐1 Boolean:       true, false Double:        1.0, 1d, 1e3, 1.234e‐6 Long:     ...
Express                                   YourselfXeNoNiQUe.co.uk (c) 2011   4/14/2011          22
Expressions == Resultsval msg = “Macro Economics”val hasA =  if ( msg contains ‘a’)     “yes”  else     “no”println(hasA) ...
Expressions On Everythingval z1 =  try {     “play havoc”  }  finally {     “yes”  }// z1 is “yes”                    XeNo...
Expressions Initialise Valsval powerSeries = {  var x = 2.0;  var sum = 1.0  for ( c <- 1 to 7 ) yield {     sum += x; x =...
How To Declare Functionsdef volumePrice( price: Float, vol: Int ): Float = {    if ( vol >= 1000 )       price * 0.90    e...
Functions Written Conciselydef max( x: Double, y: Double ): Double   = if ( x > y) x else ydef min( x: Double, y: Double )...
Procedures and The Unit Typedef sideEffect(): Unit = println(“Say hi!”)// sayHi: ()UnitsideEffect()          // prints “Sa...
Classes    XeNoNiQUe.co.uk (c) 2011   4/14/2011   29
How To Declare Classesclass Fooval f1 = new Foo()val f2 = new Fooclass Bar ( val name: String )val b1 = new Bar(“Twix”)val...
The Primary Constructorclass Person (    val firstName: String    val lastName: String,    val height: Float,    val age: ...
Class ‐ Better Styleclass Person (    val firstName: String, val lastName: String,    val height: Float, val age: Int ) { ...
Class ‐ Auxiliary Constructorsclass Complex( real: Float, imag: Float {    def this() = this(0)    def this( r: Float ) = ...
Built‐In Control Structures #1var x1 = 3.0var r1 = if ( x1 >= 0 )  "positive" else "negative"x1 = -9.25println( if ( x1 < ...
Built‐In Control Structures #2While ... Do           Do ... Whilevar c1 = 0             var c2 = 0var y1 = ""            v...
Scala Fixes Java MishapsScala Removes             Scala Innovates  Break and Continue          Operator overloading  Stati...
Infix Operators in Classesclass Complex( val re:Float, val im: Float ) {    def +( x:Complex ): Complex = {        new Com...
Using Operator Overloadingval   z1   =   new Complex(3,4)val   z2   =   new Complex(1,2)val   z3   =   z1 + z2    // = z1....
Infix Operator AssociativityNormally expressions associate from LEFT to RIGHTval x = 1 + 2 + 3 + 4val x = ((1 + 2) + 3 ) +...
Companion Objects• Represents a single instance of a class• Serves the analogous role of “static” in Java• Frequently defi...
Comprehensions   XeNoNiQUe.co.uk (c) 2011   4/14/2011   41
For‐Loop Expressionsfor ( j <- 1 to 4 )  println( "Iteration "+j )// Iteration 1 .. 4for ( j <- 1 until 4 )  println( "Ite...
Looping Over Collectionsval fruits = List("apple",  "orange","pear",  "kiwi", "plum" )for ( fruit <- fruits )  println( fr...
For‐Filter Comprehensionsfor ( trade <- trades  if trade.tradeType == "FX" &&  trade.amount >= 75000 &&  trade.counterpart...
For‐Nested‐Filter Comprehensionfor ( trade <- trades  if trade.tradeType == "MM" ;  if trade.origin == "Summit";  settleme...
Function Objects        XeNoNiQUe.co.uk (c) 2011   4/14/2011   46
Function Object ‐ Long Handval isEven = new Function1 [ Int, Boolean ] {    def apply( k: Int ) = k % 2 == 0}Syntactic def...
First‐Class Functionsval isEven: (Int => Boolean) = (k: Int) => k % 2 == 0// The verbose short‐hand notionFunctions are va...
First‐Class Functionsval isEven = (k: Int ) => k % 2 == 0// The short‐hand notion // Scala infers the function type for th...
Calling Function ObjectsisEven.apply(24)                              // trueisEven(11)                                   ...
Filter Out Even Numbersval numbers = List(0,1,2,3,4,5,6,7)// List[Int] = List(0,1,2,3,4,5,6,7)numbers.filter( isEven )// L...
Filter Out Even Numbersval numbers = List(0,1,2,3,4,5,6,7)numbers.filter( (k: Int) => k % 2 == 0 )// in-lined function val...
Filter Out Even Numbersval numbers = List(0,1,2,3,4,5,6,7)numbers.filter( k => k % 2 == 0 )// 0,2,4,6                     ...
Filter Out Even Numbersval numbers = List(0,1,2,3,4,5,6,7)numbers.filter( _ % 2 == 0 )// 0,2,4,6                     XeNoN...
Function Object Summary ( x: Float ) => sin(pi * x)         / (pi * x )              XeNoNiQUe.co.uk (c) 2011   4/14/2011 ...
Closures( x: Float ) => extra +    sin(pi * x) / (pi * x )              XeNoNiQUe.co.uk (c) 2011   4/14/2011   56
Real World Closuresvar extra = computeFudgeFactor()reactions += {   case e:MouseClicked =>      plotXY( -1.0, 1.0, -2.0, 2...
Closure Lexical Scopevar extra = 4val addExtra = (x: Int) => x + extraaddExtra(2)   // 6extra = 7addExtra(2)   // 9       ...
Curried Functions  ( x: Float )( y: Float ) =>   y * cos ( sin (pi * x ) )               XeNoNiQUe.co.uk (c) 2011   4/14/2...
Functions Can Return Functionsdef foo1( x: Float)(y: Float ) = x*y-2*xdef foo1( x: Float) = { (y: Float ) => x*y-2*x }val ...
Parameterised Typesclass Holder [T] ( val value: T )val chipBox = new Holder( 555 )val z1 = chipBox.value      // 555val f...
Call‐By‐Value versus Call‐By‐NameCall By Value                  Call By Name  Expression are evaluated         Expressions...
Custom Control Abstractionsdef using[ T <: { def close() }, A ]    ( closable: T ) ( body: T => A ) = {    try {        bo...
Closures As Control Abstractionimport java.io._val file = new File( "poem.txt" )using(  new BufferedReader(     new FileRe...
Pattern Matching   XeNoNiQUe.co.uk (c) 2011   4/14/2011   65
Case Classes Convenience data types for pattern matching Scala compiler creates :  Class with hashCode(), equalsTo(), copy...
Case Classescase class Stock( name: String, size: Int )val st1 = Stock( "EDH", 15000 )val st2 = Stock( “XNF", 40000 )val n...
Pattern Matching on Typesval list = List( 1967, "Legacy", £, 51.50F )for ( e <- list ) {    e match {        case f: Float...
Pattern Matching on Sequencesval list = List( 1967, "Legacy", £, 51.50F )list match {    case 1967 :: _ :: ‘£’ :: _ => pri...
Pattern Matching Algorithmsdef fib( n: Int ): Long = {    n match {        case 0 => 0        case 1 => 1        case n =>...
Case Classes Abstract Data Typesabstract class BinTree[T]case object Empty extends BinTreecase class Node (  elem: T, left...
Pattern Matching Algorithm// Traverse tree in-order by algorithmic casesdef inOrder[T]( n: BinTree[T] ) : List[T] = {  n m...
Pattern Matching Algorithm// Recursively find the depth of the binary treedef depth[T]( n: BinTree[T] ): Int = {  n match ...
Composition      XeNoNiQUe.co.uk (c) 2011   4/14/2011   74
Traits and Mix‐ins Trait is provides composition of behaviour  type in Scala Traits can define abstract methods Traits can...
Mix‐Ins and Traitstrait   Vehicletrait   Car extends Vehicletrait   Bicycle extends Vehicletrait   Motorcycle extends Vehi...
Mix‐In Compositionclass Ford extends Car with Powered with HasWheelsclass Chopper extends Bicycle with HasWheelsval myCar ...
Mix‐Ins Refactoredtrait Powered {    def kickdown() = "Vrroom!!"}trait HasWheels {    def turn() = "Wheels are turning"}  ...
Mix‐ins Refactored #2trait Vehicletrait Car extends Vehicle with HasWheels   with Poweredtrait Bicycle extends Vehicle wit...
Motorway Responsibilitydef motorway( x: Vehicle with Powered ) =  println( "on the motorway: " +x.kickdown )val aCar = new...
Collections      XeNoNiQUe.co.uk (c) 2011   4/14/2011   81
Immutable Listsscala.collection.immutable.List• Insertion at front                            O(1)• Insertion at end      ...
Creating List Collectionsimport scala.collection.immutable.Listval xs0 = List(1,2,3,4)val xs1 = 1 :: 2 :: 3 :: 4 :: Nil   ...
Creating Nested Listsval xs2 = ( 1 :: 2 :: 3 :: Nil) ::  ( 4 :: 5 :: Nil ) ::  ( 6 :: Nil ) ::  Nil// xs2: List[List[Int]]...
List Functionsval list = List(1,2,3,4,5)val z0 = list.head       // 1val z1 = list.tail       // List(2,3,4)val z2 = list....
Higher Order Operationsval list = List(1,2,3,4,5)val z0 = list.last                      // Int 5val z1 = list.map( _ +   ...
Sorting List Collectionsval xs = List( 11, 7, 2, 15, 9, 1 )val x0 = xs.sort( _ < _ )  // List[Int](1, 2, 7, 9, 11, 15)val ...
More Higher Operationsval xs = List( "apple", “plum", "orange" )val z0 = xs.zipWithIndex  // List((apple,0), (plum,1), (or...
Map Collections Typesvar capitals = Map( "England" -> "London",    "Scotland" -> "Edinburgh", "Wales" -> "Cardiff",  "Nort...
Set Collections Typesimport scala.collection.immutable.SortedSetvar xs = SortedSet( 3,2,1 )println(xs)       // TreeSet(1,...
Implicit Conversions“Can you make an ADT from a library and make   it look just like it is part of the language?”,  Guy St...
Declare Implicit Conversionsobject Complex {    implicit def doubleToComplex( x: Double ) =       new Complex( x, 0 )    v...
Using Implicit Conversionimport xenonique.numerics.Complexval   z1   =   new Complex( 4.7, -2.3 )val   z4   =   2 + c1val ...
Tools        XeNoNiQUe.co.uk (c) 2011   4/14/2011   94
BuildersScala – Launcher / REPLScalac ‐ CompilerScaladoc – Documentation GeneratorSBT ‐ Simple Build Tool Maven Scala Plug...
Tools ‐ IDEsIntellij IDEA v10.2Eclipse Helios v3.6Net Beans v7.0EmacsJEdit, NotePad++, TextPad, TextMate                  ...
Tools ‐ FrameworksTesting       Domain SpecificScala Test    Lift Specs         AkkaScala Check   Play!              Camel...
End Game  XeNoNiQUe.co.uk (c) 2011   4/14/2011   98
Breaking The Mono‐Culture“Do not throw the baby out with the bath water by clinging to a Java‐only monoculture approach: i...
Beyond Java Today              XeNoNiQUe.co.uk (c) 2011   4/14/2011   100
Beyond Java Future 2016?              XeNoNiQUe.co.uk (c) 2011   4/14/2011   101
Scalable Language                PowerfulComprehensive                                Deep Language     Responsible       ...
Learn more  http://xenonique.co.uk/blog/  peter.pilgrim@gmail.com  http://scala‐lang.org/  twitter:peter_pilgrim          ...
Professional Services    peter.pilgrim@gmail.com    Scala Adoption in Enterprises    Contracting    Training with Consulta...
Introduction to ScalaThe Object‐Functional Programming LanguagePeter PilgrimJava Champion ‐Java EE specialist w/ Scala ent...
Recommended References Programming in Scala by Martin Odersky, Lex Spoon, Bill Venners ; Artima;  2nd Edition 2010 http://...
Popular Scala Frameworks Scala Test  http://www.scalatest.org/ Scala Check https://www.ohloh.net/p/scalacheck Lift http://...
AttributionsAll images are Creative Commons (CC) License  from Flickr.com– “You must attribute the source and you cannot c...
AttributionsAll images are Creative Commons (CC) License  from Flickr.com– “You must attribute the source and you cannot c...
Upcoming SlideShare
Loading in...5
×

ACCU 2011 Introduction to Scala: An Object Functional Programming Language

3,340

Published on

Peter Pilgrim
Oracle Java Champion


Wednesday 13 April 2011 in Cherwell Room 11am gave a 90 minute presentation on the subject



Introduction into Scala : The Object-Functional Programming Language

This is a presentation that out lined the technical feel of Scala 2.8 programming language.

“More and more programmers are going to need to understand functional programming at a productive level. Especially over the next 5 to 10 years” - IBM, Jason Stidd, Functional Programming Blog, 2010


The presentation covers:


Classes and Companion Objects
Function Objects
Case classes and Pattern matching
Traits, Mix-ins and Compositions
Scala Collections
Library Frameworks
“Scala enjoys a singular advantage: performance. The language is compiled to optimised byte codes and runs as fast as native Java” Infoworld, 2010


Learn More:


http://xenonique.co.uk/blog/
peter.pilgrim@gmail.com
http://scala-lang.org/
twitter:peter_pilgrim

Published in: Education, Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,340
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
82
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "ACCU 2011 Introduction to Scala: An Object Functional Programming Language"

  1. 1. Peter PilgrimOracle Java ChampionINTRODUCTION INTO SCALA THE OBJECT‐FUNCTIONAL PROGRAMMING LANGUAGE XeNoNiQUe.co.uk (c) 2011 4/14/2011 1
  2. 2. Blog: www.XeNoNiQUe.co.uk/blog/ACCU: Member since 1993Education: London South Bank UniversityLanguages: Scala, Groovy, JavaFX, JavaConferences: JavaOne, ACCU, QCon, Devoxx XeNoNiQUe.co.uk (c) 2011 4/14/2011 2
  3. 3. “If I were a pick a language to use today other than Java, it would be Scala” James Goslinghttp://www.adam‐bien.com/roller/abien/entry/java_net_javaone_which_programming XeNoNiQUe.co.uk (c) 2011 4/14/2011 3
  4. 4. Headline News “More and more programmers are going to need to  understand functional programming at a productive  level. Especially over the next 5 to 10 yeas” ‐ IBM, Jason  Stidd, Functional Programming Blog, 2010 “Scala enjoys a singular advantage: performance. The  language is compiled to optimised byte codes and runs  as fast as native Java” Infoworld, 2010 XeNoNiQUe.co.uk (c) 2011 4/14/2011 4
  5. 5. Demo XeNoNiQUe.co.uk (c) 2011 4/14/2011 5
  6. 6. Today’s Agenda Classes and Companion Objects Function Objects Case classes and Pattern matching Traits, Mix‐ins and Compositions Scala Collections Library Frameworks XeNoNiQUe.co.uk (c) 2011 4/14/2011 6
  7. 7. The Basics XeNoNiQUe.co.uk (c) 2011 4/14/2011 7
  8. 8. Scalable Language Very Bright FutureFunctional Purely Object Oriented Statically Typed JVM Language XeNoNiQUe.co.uk (c) 2011 4/14/2011 8
  9. 9. Martin Odersky ‐ Language Designer XeNoNiQUe.co.uk (c) 2011 4/14/2011 9
  10. 10. A Brief History of Scala Make Java Better  1996 – 2000: Pizza, GJ and javac Make a Better Java 2003 : The Scala 1.0 Experiment 2005 : Scala 2.0, written in Scala 2006‐2011:  Industrial strength  XeNoNiQUe.co.uk (c) 2011 4/14/2011 10
  11. 11. A Java Classpublic class Person { public final String firstName, lastName; public final float height; public final int age; public Person( String firstName, String lastName, float height, int age ) { this.firstName; this.lastName = lastName; this.height = height; this.age = age; }} XeNoNiQUe.co.uk (c) 2011 4/14/2011 11
  12. 12. Equivalent Scala classclass Person ( val firstName: String val lastName: String, val height: Float, val age: Int ) { } XeNoNiQUe.co.uk (c) 2011 4/14/2011 12
  13. 13. Filtering Data with Javaimport java.util.ArrayList;Person[] people = getPeople();Person[] tallFolk;Person[] shortFolk;{ ArrayList<Person> tallList = new ArrayList<Person>(); ArrayList<Person> shortList = new ArrayList<Person>(); for ( int j=0; j<people.length; ++j) { (people[j].height < 5.0 ? shortList : tallList ) .add( people[j] ); } shortFolk = smallList.toArray( people ); tallFolk = tallList.toArray( people );} XeNoNiQUe.co.uk (c) 2011 4/14/2011 13
  14. 14. And in Scalaval people: Array[Person] = getPeople()// Type inferenceval ( smallFolk, bigFolk ) = people partition ( _.height < 5.0 ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 14
  15. 15. Semicolon is optional XeNoNiQUe.co.uk (c) 2011 4/14/2011 15
  16. 16. Vals and  VarsXeNoNiQUe.co.uk (c) 2011 4/14/2011 16
  17. 17. VariablesTwo Types of variables: val a immutable variable var a re‐assignable variableval s1 = “Purple Haze” // Type inference Stringvar s2 = “Barcelo”s1 = “Hotel” // Won’t compiles2 = “Electricona” // Ok! XeNoNiQUe.co.uk (c) 2011 4/14/2011 17
  18. 18. Variables Type Inferencesval s3: String = “Purple Haze”val f1: Double = 3.141596527val fruit = List(“orange”,”apple”) // scala.collection.immutable.List[String]val capitals = Map(“USA”-> “Washington”, ”Wales” -> “Cardiff”, “Germany” -> “Berlin” ) // scala.collection.immutable.Map[String, String] XeNoNiQUe.co.uk (c) 2011 4/14/2011 18
  19. 19. Scopeval s1 = “Purple Haze”{ val s1 = “Day Tripper” println( s1 ) // "Day Tripper"}println( s1 ) // "Purple Haze" XeNoNiQUe.co.uk (c) 2011 4/14/2011 19
  20. 20. Scala IdentifiersFour forms of Scala identifiers Alphanumeric: A letter followed by a sequence of  letters or digits _ count as a letter (but single _ is reserved) $ is reserved for system use Operator: One of more symbolic characters such  + , *, /, ‐ , %, #, ! Mixed: gamma_! Quoted: any character sequence in back‐quotes:  `yield` XeNoNiQUe.co.uk (c) 2011 4/14/2011 20
  21. 21. Basic Scala Literals Integer: 1, 882, ‐1 Boolean: true, false Double:  1.0, 1d, 1e3, 1.234e‐6 Long:  42L Float:  19.73f Characters:  ‘6’, ‘@’, ‘?’, `K’ String:  “Hello world”  XeNoNiQUe.co.uk (c) 2011 4/14/2011 21
  22. 22. Express YourselfXeNoNiQUe.co.uk (c) 2011 4/14/2011 22
  23. 23. Expressions == Resultsval msg = “Macro Economics”val hasA = if ( msg contains ‘a’) “yes” else “no”println(hasA) // “yes” XeNoNiQUe.co.uk (c) 2011 4/14/2011 23
  24. 24. Expressions On Everythingval z1 = try { “play havoc” } finally { “yes” }// z1 is “yes” XeNoNiQUe.co.uk (c) 2011 4/14/2011 24
  25. 25. Expressions Initialise Valsval powerSeries = { var x = 2.0; var sum = 1.0 for ( c <- 1 to 7 ) yield { sum += x; x = x * x; sum }}// scala.collection.immutable.IndexedSeq[Double] = Vector(3.0, 7.0, 23.0, 279.0, 65815.0, 4.295033111E9, 1.8446744078004584E19) XeNoNiQUe.co.uk (c) 2011 4/14/2011 25
  26. 26. How To Declare Functionsdef volumePrice( price: Float, vol: Int ): Float = { if ( vol >= 1000 ) price * 0.90 else if ( vol >= 100 ) price * 0.95 else price} XeNoNiQUe.co.uk (c) 2011 4/14/2011 26
  27. 27. Functions Written Conciselydef max( x: Double, y: Double ): Double = if ( x > y) x else ydef min( x: Double, y: Double ): Double = if ( x < y) y else x// type inference on the return type: Doubledef cube( x: Double ) = x * x * x XeNoNiQUe.co.uk (c) 2011 4/14/2011 27
  28. 28. Procedures and The Unit Typedef sideEffect(): Unit = println(“Say hi!”)// sayHi: ()UnitsideEffect() // prints “Say hi!”• Unit has a value, written as ()• Unit roughly corresponds to void in Java XeNoNiQUe.co.uk (c) 2011 4/14/2011 28
  29. 29. Classes XeNoNiQUe.co.uk (c) 2011 4/14/2011 29
  30. 30. How To Declare Classesclass Fooval f1 = new Foo()val f2 = new Fooclass Bar ( val name: String )val b1 = new Bar(“Twix”)val b2 = new Bar(“Curly-Wurly”) XeNoNiQUe.co.uk (c) 2011 4/14/2011 30
  31. 31. The Primary Constructorclass Person ( val firstName: String val lastName: String, val height: Float, val age: Int ) { if ( age < 0 ) throw new Exception("age?") if ( height <= 0.5 ) throw new Exception("height?")} XeNoNiQUe.co.uk (c) 2011 4/14/2011 31
  32. 32. Class ‐ Better Styleclass Person ( val firstName: String, val lastName: String, val height: Float, val age: Int ) { require( age > 0, "age > 0" ) require( height >= 0.5, "height >= 0.5" ) override def toString = "%s %s %3d %5.2f (ft)". format( firstName, lastName, age, height )} XeNoNiQUe.co.uk (c) 2011 4/14/2011 32
  33. 33. Class ‐ Auxiliary Constructorsclass Complex( real: Float, imag: Float { def this() = this(0) def this( r: Float ) = this ( r, 0 ) def this( r: String ) = this ( java.lang.Float.parseFloat(r), 0 ); def this( r: String, i: String ) = this ( java.lang.Float.parseFloat(r), java.lang.Float.parseFloat(i) ) // ...} XeNoNiQUe.co.uk (c) 2011 4/14/2011 33
  34. 34. Built‐In Control Structures #1var x1 = 3.0var r1 = if ( x1 >= 0 ) "positive" else "negative"x1 = -9.25println( if ( x1 < 0 ) "negative" else "positive" ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 34
  35. 35. Built‐In Control Structures #2While ... Do Do ... Whilevar c1 = 0 var c2 = 0var y1 = "" var y2 = ""while ( c1 < 4 ) { do { y1 = y1 + "#" + c1 y2 = y2 + "#" + c2 c1 += 1 c2 += 1} }println(y2) while ( c2 < 4 ) println(y2) XeNoNiQUe.co.uk (c) 2011 4/14/2011 35
  36. 36. Scala Fixes Java MishapsScala Removes Scala Innovates Break and Continue Operator overloading Static members Function objects Primitive types Companion Objects Special treatment of  Case classes interfaces User control abstractions Mix‐ins Pattern matching Implicit conversions XeNoNiQUe.co.uk (c) 2011 4/14/2011 36
  37. 37. Infix Operators in Classesclass Complex( val re:Float, val im: Float ) { def +( x:Complex ): Complex = { new Complex( this.re + x.re, this.im + x.im ) } def -( x:Complex ): Complex = { new Complex( this.re - x.re, this.im - x.im ) } // ... override def toString = re + (if (im < 0 ) "-" +(-im) else "+" +im )+"i"} XeNoNiQUe.co.uk (c) 2011 4/14/2011 37
  38. 38. Using Operator Overloadingval z1 = new Complex(3,4)val z2 = new Complex(1,2)val z3 = z1 + z2 // = z1.+(z2)val z4 = z1 * z2 // = z1.*(z2)val z5 = z1 - z2 // = z1.-(z2)val z6 = z1 / z2 // = z1./(z2) XeNoNiQUe.co.uk (c) 2011 4/14/2011 38
  39. 39. Infix Operator AssociativityNormally expressions associate from LEFT to RIGHTval x = 1 + 2 + 3 + 4val x = ((1 + 2) + 3 ) + 4Except for those operators that end with a colon(:) They associate from RIGHT to LEFTval list = 1 :: 2 :: 3 :: 4 :: Nilval list = 1 :: ( 2 :: ( 3 :: (4 :: Nil ))) XeNoNiQUe.co.uk (c) 2011 4/14/2011 39
  40. 40. Companion Objects• Represents a single instance of a class• Serves the analogous role of “static” in Java• Frequently defines two methods apply() and  unapply() for factories and extractionobject Complex { val i = new Complex( 0, 1 ) def apply( re: Float, im: Float ) = new Complex( re, im )} XeNoNiQUe.co.uk (c) 2011 4/14/2011 40
  41. 41. Comprehensions XeNoNiQUe.co.uk (c) 2011 4/14/2011 41
  42. 42. For‐Loop Expressionsfor ( j <- 1 to 4 ) println( "Iteration "+j )// Iteration 1 .. 4for ( j <- 1 until 4 ) println( "Iteration "+j )// Iteration 1 .. 3 XeNoNiQUe.co.uk (c) 2011 4/14/2011 42
  43. 43. Looping Over Collectionsval fruits = List("apple", "orange","pear", "kiwi", "plum" )for ( fruit <- fruits ) println( fruit ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 43
  44. 44. For‐Filter Comprehensionsfor ( trade <- trades if trade.tradeType == "FX" && trade.amount >= 75000 && trade.counterparty.toUpperCase .startsWith("North")) processLayerDown( trade ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 44
  45. 45. For‐Nested‐Filter Comprehensionfor ( trade <- trades if trade.tradeType == "MM" ; if trade.origin == "Summit"; settlement <- trade.settlements settlement.exists( _.name == Standard )) settleStandard( settlement ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 45
  46. 46. Function Objects XeNoNiQUe.co.uk (c) 2011 4/14/2011 46
  47. 47. Function Object ‐ Long Handval isEven = new Function1 [ Int, Boolean ] { def apply( k: Int ) = k % 2 == 0}Syntactic definition for function type that:• Accepts an Integer parameter• Returns a Boolean value• Defines a method called apply to invoke the function definition. XeNoNiQUe.co.uk (c) 2011 4/14/2011 47
  48. 48. First‐Class Functionsval isEven: (Int => Boolean) = (k: Int) => k % 2 == 0// The verbose short‐hand notionFunctions are values, values are objectErgo, functions are objects in Scala XeNoNiQUe.co.uk (c) 2011 4/14/2011 48
  49. 49. First‐Class Functionsval isEven = (k: Int ) => k % 2 == 0// The short‐hand notion // Scala infers the function type for the LHS XeNoNiQUe.co.uk (c) 2011 4/14/2011 49
  50. 50. Calling Function ObjectsisEven.apply(24) // trueisEven(11) // false XeNoNiQUe.co.uk (c) 2011 4/14/2011 50
  51. 51. Filter Out Even Numbersval numbers = List(0,1,2,3,4,5,6,7)// List[Int] = List(0,1,2,3,4,5,6,7)numbers.filter( isEven )// List[Int] = List(0,2,4,6)Apply the function object isEven to all members of the sequence XeNoNiQUe.co.uk (c) 2011 4/14/2011 51
  52. 52. Filter Out Even Numbersval numbers = List(0,1,2,3,4,5,6,7)numbers.filter( (k: Int) => k % 2 == 0 )// in-lined function value:// List[Int] = List(0,2,4,6) XeNoNiQUe.co.uk (c) 2011 4/14/2011 52
  53. 53. Filter Out Even Numbersval numbers = List(0,1,2,3,4,5,6,7)numbers.filter( k => k % 2 == 0 )// 0,2,4,6 XeNoNiQUe.co.uk (c) 2011 4/14/2011 53
  54. 54. Filter Out Even Numbersval numbers = List(0,1,2,3,4,5,6,7)numbers.filter( _ % 2 == 0 )// 0,2,4,6 XeNoNiQUe.co.uk (c) 2011 4/14/2011 54
  55. 55. Function Object Summary ( x: Float ) => sin(pi * x) / (pi * x ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 55
  56. 56. Closures( x: Float ) => extra + sin(pi * x) / (pi * x ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 56
  57. 57. Real World Closuresvar extra = computeFudgeFactor()reactions += { case e:MouseClicked => plotXY( -1.0, 1.0, -2.0, 2.0, ( x: Float ) => extra + sin(pi * x) / (pi * x ) )}The variable extra defined in the enclosing scope is bounded to the lexical scope of the function object. XeNoNiQUe.co.uk (c) 2011 4/14/2011 57
  58. 58. Closure Lexical Scopevar extra = 4val addExtra = (x: Int) => x + extraaddExtra(2) // 6extra = 7addExtra(2) // 9 XeNoNiQUe.co.uk (c) 2011 4/14/2011 58
  59. 59. Curried Functions ( x: Float )( y: Float ) => y * cos ( sin (pi * x ) ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 59
  60. 60. Functions Can Return Functionsdef foo1( x: Float)(y: Float ) = x*y-2*xdef foo1( x: Float) = { (y: Float ) => x*y-2*x }val a1 = foo1( 3 ) ( 4 ) // a1 is 6.0val a2 = foo1( 3 ) // a2 is (Float) => Float = <function1>val a3 = a2(4) // a3 = 6.0 XeNoNiQUe.co.uk (c) 2011 4/14/2011 60
  61. 61. Parameterised Typesclass Holder [T] ( val value: T )val chipBox = new Holder( 555 )val z1 = chipBox.value // 555val fruitBox = new Holder( "apple" )val z2 = fruitBox.value // “apple”fruitBox.value = "orange" // re-assign errorchipBox.value = 73 // re-assign error XeNoNiQUe.co.uk (c) 2011 4/14/2011 61
  62. 62. Call‐By‐Value versus Call‐By‐NameCall By Value Call By Name Expression are evaluated   Expressions are evaluated  before being passed as a  inside the function parameter to a function Computational nice Useful for library writers to   create custom control  abstractions def debug( s: String ):Unit def debug( s:  => String ):Unit XeNoNiQUe.co.uk (c) 2011 4/14/2011 62
  63. 63. Custom Control Abstractionsdef using[ T <: { def close() }, A ] ( closable: T ) ( body: T => A ) = { try { body( closable ) } finally { if ( closable != null ) { try { closable.close() } catch { case e: Exception => // Log this error } } }} XeNoNiQUe.co.uk (c) 2011 4/14/2011 63
  64. 64. Closures As Control Abstractionimport java.io._val file = new File( "poem.txt" )using( new BufferedReader( new FileReader( file )) ) { r => println( r.readLine() )} XeNoNiQUe.co.uk (c) 2011 4/14/2011 64
  65. 65. Pattern Matching XeNoNiQUe.co.uk (c) 2011 4/14/2011 65
  66. 66. Case Classes Convenience data types for pattern matching Scala compiler creates : Class with hashCode(), equalsTo(), copy() methods Nice toString() method Defaults to immutable data members Companion object  Defines apply() and unapply() (extractor) methods XeNoNiQUe.co.uk (c) 2011 4/14/2011 66
  67. 67. Case Classescase class Stock( name: String, size: Int )val st1 = Stock( "EDH", 15000 )val st2 = Stock( “XNF", 40000 )val nameAndValue = st2.name + “ “ +st1.value // “EDH 15000”val st3 = st2.copy()val st4 = st3.copy( name = "AXA")assert( st2 == st3 ) // trueassert( st2 != st4 ) // true XeNoNiQUe.co.uk (c) 2011 4/14/2011 67
  68. 68. Pattern Matching on Typesval list = List( 1967, "Legacy", £, 51.50F )for ( e <- list ) { e match { case f: Float => println("A decimal "+f ) case s: String => println("A string "+s ) case c: Char => println("A character "+c ) case _ => println("I do not know “+e ) }} XeNoNiQUe.co.uk (c) 2011 4/14/2011 68
  69. 69. Pattern Matching on Sequencesval list = List( 1967, "Legacy", £, 51.50F )list match { case 1967 :: _ :: ‘£’ :: _ => println("got it") case _ => println("not found" )}list match { case List( 1967, "Legacy", _* ) => println("got two" ) case _ => println("not found")} XeNoNiQUe.co.uk (c) 2011 4/14/2011 69
  70. 70. Pattern Matching Algorithmsdef fib( n: Int ): Long = { n match { case 0 => 0 case 1 => 1 case n => fib(n-2) + fib(n-1) }}val z1 = fib(3) // 2val series = (0 to 25).map( fib _ ).mkString("n") XeNoNiQUe.co.uk (c) 2011 4/14/2011 70
  71. 71. Case Classes Abstract Data Typesabstract class BinTree[T]case object Empty extends BinTreecase class Node ( elem: T, left: BinTree[T], right: BinTree[T]) extends BinTree XeNoNiQUe.co.uk (c) 2011 4/14/2011 71
  72. 72. Pattern Matching Algorithm// Traverse tree in-order by algorithmic casesdef inOrder[T]( n: BinTree[T] ) : List[T] = { n match { case Empty => List() case BinTree(e,l,r) => inOrder(l) ::: List(e) ::: inOrder(r) }} XeNoNiQUe.co.uk (c) 2011 4/14/2011 72
  73. 73. Pattern Matching Algorithm// Recursively find the depth of the binary treedef depth[T]( n: BinTree[T] ): Int = { n match { case Empty => 0 case Node( _, Empty, r ) => 1 + depth(r) case Node( _, l, Empty ) => 1 + depth(l) case Node( _, l, r ) => Math.max( depth(l), depth(r)) + 1 }} XeNoNiQUe.co.uk (c) 2011 4/14/2011 73
  74. 74. Composition XeNoNiQUe.co.uk (c) 2011 4/14/2011 74
  75. 75. Traits and Mix‐ins Trait is provides composition of behaviour  type in Scala Traits can define abstract methods Traits can define implementation methods Traits can define data members Linearisation of behaviour is prioritised from  left to right Traits can inherit from other traits XeNoNiQUe.co.uk (c) 2011 4/14/2011 75
  76. 76. Mix‐Ins and Traitstrait Vehicletrait Car extends Vehicletrait Bicycle extends Vehicletrait Motorcycle extends Vehicletrait Poweredtrait HasWheels XeNoNiQUe.co.uk (c) 2011 4/14/2011 76
  77. 77. Mix‐In Compositionclass Ford extends Car with Powered with HasWheelsclass Chopper extends Bicycle with HasWheelsval myCar = new Fordval myBike = new Chopper XeNoNiQUe.co.uk (c) 2011 4/14/2011 77
  78. 78. Mix‐Ins Refactoredtrait Powered { def kickdown() = "Vrroom!!"}trait HasWheels { def turn() = "Wheels are turning"} XeNoNiQUe.co.uk (c) 2011 4/14/2011 78
  79. 79. Mix‐ins Refactored #2trait Vehicletrait Car extends Vehicle with HasWheels with Poweredtrait Bicycle extends Vehicle with HasWheelstrait Motorcycle extends Vehicle with HasWheels with Poweredtrait Bus extends Cartrait Truck extends Cartrait SUV extends Car XeNoNiQUe.co.uk (c) 2011 4/14/2011 79
  80. 80. Motorway Responsibilitydef motorway( x: Vehicle with Powered ) = println( "on the motorway: " +x.kickdown )val aCar = new Fordval aBike = new Choppermotorway( aCar ) // Okmotorway( aBike ) // Won’t compile! XeNoNiQUe.co.uk (c) 2011 4/14/2011 80
  81. 81. Collections XeNoNiQUe.co.uk (c) 2011 4/14/2011 81
  82. 82. Immutable Listsscala.collection.immutable.List• Insertion at front  O(1)• Insertion at end  O(n) XeNoNiQUe.co.uk (c) 2011 4/14/2011 82
  83. 83. Creating List Collectionsimport scala.collection.immutable.Listval xs0 = List(1,2,3,4)val xs1 = 1 :: 2 :: 3 :: 4 :: Nil XeNoNiQUe.co.uk (c) 2011 4/14/2011 83
  84. 84. Creating Nested Listsval xs2 = ( 1 :: 2 :: 3 :: Nil) :: ( 4 :: 5 :: Nil ) :: ( 6 :: Nil ) :: Nil// xs2: List[List[Int]] = List(List(1, 2, 3), List(4, 5), List(6)) XeNoNiQUe.co.uk (c) 2011 4/14/2011 84
  85. 85. List Functionsval list = List(1,2,3,4,5)val z0 = list.head // 1val z1 = list.tail // List(2,3,4)val z2 = list.isEmpty // falseval z3 = list.size // 4 XeNoNiQUe.co.uk (c) 2011 4/14/2011 85
  86. 86. Higher Order Operationsval list = List(1,2,3,4,5)val z0 = list.last // Int 5val z1 = list.map( _ + 3 ) // List( 4,5,6,7,8 )val z2 = list.take( 2 ) // List(1,2)val z3 = list.drop( 2 ) // List(3,4,5)val z4 = list.slice( 2,4 ) // List(3,4)val z5 = list.reverse // List(5,4,3,2,1)val z7 = list.contains(3) // trueval z8 = list.filter( _ < 3 ) // List( 1,2 ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 86
  87. 87. Sorting List Collectionsval xs = List( 11, 7, 2, 15, 9, 1 )val x0 = xs.sort( _ < _ ) // List[Int](1, 2, 7, 9, 11, 15)val x1 = xs.sort( _ > _ ) // List[Int](15, 11, 9, 7, 2, 1) XeNoNiQUe.co.uk (c) 2011 4/14/2011 87
  88. 88. More Higher Operationsval xs = List( "apple", “plum", "orange" )val z0 = xs.zipWithIndex // List((apple,0), (plum,1), (orange,2))val ys = List( "usa", "uk", "france" )val z1 = xs zip ys // List((apple,usa), (plum,uk), (orange,france))val zs = List( List(1,2,3), List(4,5), List(6))val z2 = zs flatten // List(1, 2, 3, 4, 5, 6) XeNoNiQUe.co.uk (c) 2011 4/14/2011 88
  89. 89. Map Collections Typesvar capitals = Map( "England" -> "London", "Scotland" -> "Edinburgh", "Wales" -> "Cardiff", "Northern Ireland" -> "Belfast" )capitals += ( "Brasil" -> "Brasilia" )val z0 = capitals( "Brasil“ ) // “Brasilia”val z1 = capitals.isEmpty // falseval z2 = capitals.size // 4for ( (k,v) <- capitals ) println("Capital of "+k+" is "+v ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 89
  90. 90. Set Collections Typesimport scala.collection.immutable.SortedSetvar xs = SortedSet( 3,2,1 )println(xs) // TreeSet(1,2,3 )xs += 4xs += 3println(xs) // TreeSet(1,2,3,4 )xs -= 2println(xs) // TreeSet(1,3,4 )xs ++= List( 5,6)println(xs) // TreeSet(1,2,4,5,6 ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 90
  91. 91. Implicit Conversions“Can you make an ADT from a library and make  it look just like it is part of the language?”, Guy Steele, Benchmark of Languages Implicit informs the compiler about a custom  default conversion method Power enabler for writing embedded DSL in  Scala XeNoNiQUe.co.uk (c) 2011 4/14/2011 91
  92. 92. Declare Implicit Conversionsobject Complex { implicit def doubleToComplex( x: Double ) = new Complex( x, 0 ) val i = new Complex( 0, 1 ) def apply( re: Float, im: Float ) = new Complex( re, im )} XeNoNiQUe.co.uk (c) 2011 4/14/2011 92
  93. 93. Using Implicit Conversionimport xenonique.numerics.Complexval z1 = new Complex( 4.7, -2.3 )val z4 = 2 + c1val z2 = 2.50 * c1val z3 = (2.50).*(c1) XeNoNiQUe.co.uk (c) 2011 4/14/2011 93
  94. 94. Tools XeNoNiQUe.co.uk (c) 2011 4/14/2011 94
  95. 95. BuildersScala – Launcher / REPLScalac ‐ CompilerScaladoc – Documentation GeneratorSBT ‐ Simple Build Tool Maven Scala Plug‐inApache Ant Plug‐InGradle XeNoNiQUe.co.uk (c) 2011 4/14/2011 95
  96. 96. Tools ‐ IDEsIntellij IDEA v10.2Eclipse Helios v3.6Net Beans v7.0EmacsJEdit, NotePad++, TextPad, TextMate XeNoNiQUe.co.uk (c) 2011 4/14/2011 96
  97. 97. Tools ‐ FrameworksTesting Domain SpecificScala Test  Lift Specs AkkaScala Check Play! Camel DSL Wicket Squeryl, Pinky, Sweet XeNoNiQUe.co.uk (c) 2011 4/14/2011 97
  98. 98. End Game XeNoNiQUe.co.uk (c) 2011 4/14/2011 98
  99. 99. Breaking The Mono‐Culture“Do not throw the baby out with the bath water by clinging to a Java‐only monoculture approach: it matters not that what current systems are written in, when running on the JVM, only what happens in the future” Dr. Russel Winder, Consultanthttp://groups.google.com/group/javaposseThread: “Your Experience of Alternative JVM Languages in Organisations, Divisions and Teams” XeNoNiQUe.co.uk (c) 2011 4/14/2011 99
  100. 100. Beyond Java Today XeNoNiQUe.co.uk (c) 2011 4/14/2011 100
  101. 101. Beyond Java Future 2016? XeNoNiQUe.co.uk (c) 2011 4/14/2011 101
  102. 102. Scalable Language PowerfulComprehensive Deep Language Responsible Expressive Concise XeNoNiQUe.co.uk (c) 2011 4/14/2011 102
  103. 103. Learn more http://xenonique.co.uk/blog/ peter.pilgrim@gmail.com http://scala‐lang.org/ twitter:peter_pilgrim XeNoNiQUe.co.uk (c) 2011 4/14/2011 103
  104. 104. Professional Services peter.pilgrim@gmail.com Scala Adoption in Enterprises Contracting Training with Consultancy Technical Leadership XeNoNiQUe.co.uk (c) 2011 4/14/2011 104
  105. 105. Introduction to ScalaThe Object‐Functional Programming LanguagePeter PilgrimJava Champion ‐Java EE specialist w/ Scala enthusiasmXeNoNiQUe.co.uk/blog XeNoNiQUe.co.uk (c) 2011 4/14/2011 105
  106. 106. Recommended References Programming in Scala by Martin Odersky, Lex Spoon, Bill Venners ; Artima;  2nd Edition 2010 http://www.artima.com/shop/programming_in_scala Programming Scala by Wampler, Payne; O’Reilly; 2010; http://programming‐ scala.labs.oreilly.com/ Beginning Scala by David Pollak; Apress; 2009;  http://www.apress.com/book/view/1430219890 Steps in Scala by Loverdos , Syropoulos; Cambridge Univ Press; 2010;  XeNoNiQUe.co.uk (c) 2011 4/14/2011 106
  107. 107. Popular Scala Frameworks Scala Test  http://www.scalatest.org/ Scala Check https://www.ohloh.net/p/scalacheck Lift http://www.liftweb.net/ Akka http://akka.io/ Play! Scala module http://www.playframework.org/modules/scala Camel DSL http://camel.apache.org/scala‐dsl.html Squeryl http://squeryl.org/ Pinky https://github.com/pk11/pinky/wiki Sweet [Scala] http://code.google.com/p/sweetscala/ XeNoNiQUe.co.uk (c) 2011 4/14/2011 107
  108. 108. AttributionsAll images are Creative Commons (CC) License  from Flickr.com– “You must attribute the source and you cannot change the content”Tim Ellis http://www.flickr.com/photos/tim_ellis/Lego Basics http://www.flickr.com/photos/tim_ellis/338755101/sizes/l/*PaysImaginaire*  http://www.flickr.com/photos/nevrlndtink/Variable Plastic Bag http://www.flickr.com/photos/nevrlndtink/232906118/sizes/m/~Deiby http://www.flickr.com/photos/deiby/Expression http://www.flickr.com/photos/deiby/5489382677/sizes/l/Lisa Sinclair http://www.flickr.com/photos/plumandjello/fruit http://www.flickr.com/photos/plumandjello/2333263539/sizes/l/Nerovivo http://www.flickr.com/photos/dominik99/http://www.flickr.com/photos/dominik99/407716865/sizes/z/in/photostream/ XeNoNiQUe.co.uk (c) 2011 4/14/2011 108
  109. 109. AttributionsAll images are Creative Commons (CC) License  from Flickr.com– “You must attribute the source and you cannot change the content”.Guilty http://www.flickr.com/photos/roll_initiative/Arbitrary Function Generator http://www.flickr.com/photos/roll_initiative/3278642272/Loop Oh Rupert Grazer http://www.flickr.com/photos/loop_oh/Pattern at the Senckenberg Museum in Frankfurt am Main / Germany. http://www.flickr.com/photos/loop_oh/4571485915/Lili Vieira de Carvalho, Vancouver, Canada http://www.flickr.com/people/lilivc/Composition of Bowls http://www.flickr.com/photos/lilivc/367582911/sizes/l/Mykl Roventine http://www.flickr.com/people/myklroventine/19/365 Game Over http://www.flickr.com/photos/myklroventine/3210068573/sizes/l/superciliousness / Bentley Smith http://www.flickr.com/people/superciliousness/200510 carpenters tools ‐ inside the workmans shed ‐ all his old tools http://www.flickr.com/photos/superciliousness/57486288/ XeNoNiQUe.co.uk (c) 2011 4/14/2011 109
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×