ACCU 2011 Introduction to Scala: An Object Functional Programming Language

  • 3,196 views
Uploaded on

Peter Pilgrim …

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

More in: Education , Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,196
On Slideshare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
81
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Peter PilgrimOracle Java ChampionINTRODUCTION INTO SCALA THE OBJECT‐FUNCTIONAL PROGRAMMING LANGUAGE XeNoNiQUe.co.uk (c) 2011 4/14/2011 1
  • 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. “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. 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. Demo XeNoNiQUe.co.uk (c) 2011 4/14/2011 5
  • 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. The Basics XeNoNiQUe.co.uk (c) 2011 4/14/2011 7
  • 8. Scalable Language Very Bright FutureFunctional Purely Object Oriented Statically Typed JVM Language XeNoNiQUe.co.uk (c) 2011 4/14/2011 8
  • 9. Martin Odersky ‐ Language Designer XeNoNiQUe.co.uk (c) 2011 4/14/2011 9
  • 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. 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. 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. 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. 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. Semicolon is optional XeNoNiQUe.co.uk (c) 2011 4/14/2011 15
  • 16. Vals and  VarsXeNoNiQUe.co.uk (c) 2011 4/14/2011 16
  • 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. 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. 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. 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. 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. Express YourselfXeNoNiQUe.co.uk (c) 2011 4/14/2011 22
  • 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. Expressions On Everythingval z1 = try { “play havoc” } finally { “yes” }// z1 is “yes” XeNoNiQUe.co.uk (c) 2011 4/14/2011 24
  • 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. 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. 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. 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. Classes XeNoNiQUe.co.uk (c) 2011 4/14/2011 29
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Comprehensions XeNoNiQUe.co.uk (c) 2011 4/14/2011 41
  • 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. 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. 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. 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. Function Objects XeNoNiQUe.co.uk (c) 2011 4/14/2011 46
  • 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. 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. 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. Calling Function ObjectsisEven.apply(24) // trueisEven(11) // false XeNoNiQUe.co.uk (c) 2011 4/14/2011 50
  • 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. 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. 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. 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. Function Object Summary ( x: Float ) => sin(pi * x) / (pi * x ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 55
  • 56. Closures( x: Float ) => extra + sin(pi * x) / (pi * x ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 56
  • 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. 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. Curried Functions ( x: Float )( y: Float ) => y * cos ( sin (pi * x ) ) XeNoNiQUe.co.uk (c) 2011 4/14/2011 59
  • 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. 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. 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. 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. 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. Pattern Matching XeNoNiQUe.co.uk (c) 2011 4/14/2011 65
  • 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. 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. 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. 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. 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. 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. 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. 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. Composition XeNoNiQUe.co.uk (c) 2011 4/14/2011 74
  • 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. 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. 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. Mix‐Ins Refactoredtrait Powered { def kickdown() = "Vrroom!!"}trait HasWheels { def turn() = "Wheels are turning"} XeNoNiQUe.co.uk (c) 2011 4/14/2011 78
  • 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. 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. Collections XeNoNiQUe.co.uk (c) 2011 4/14/2011 81
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Tools XeNoNiQUe.co.uk (c) 2011 4/14/2011 94
  • 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. Tools ‐ IDEsIntellij IDEA v10.2Eclipse Helios v3.6Net Beans v7.0EmacsJEdit, NotePad++, TextPad, TextMate XeNoNiQUe.co.uk (c) 2011 4/14/2011 96
  • 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. End Game XeNoNiQUe.co.uk (c) 2011 4/14/2011 98
  • 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. Beyond Java Today XeNoNiQUe.co.uk (c) 2011 4/14/2011 100
  • 101. Beyond Java Future 2016? XeNoNiQUe.co.uk (c) 2011 4/14/2011 101
  • 102. Scalable Language PowerfulComprehensive Deep Language Responsible Expressive Concise XeNoNiQUe.co.uk (c) 2011 4/14/2011 102
  • 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. 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. 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. 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. 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. 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. 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