ACCU 2011 Introduction to Scala: An Object Functional Programming Language

3,770 views
3,694 views

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
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,770
On SlideShare
0
From Embeds
0
Number of Embeds
266
Actions
Shares
0
Downloads
85
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

×