Scala introduction

  • 5,224 views
Uploaded on

 

More in: 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
5,224
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
177
Comments
0
Likes
8

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. If I were to pick a language to use on the JVM today other than Java, it would be Scala. – James Gosling, creator of Java http://www.adam-bien.com/roller/abien/entry/java_net_javaone_which_programming Scala, it must be stated, is the current heir apparent to the Java throne. No other language on the JVM seems as capable of being a "replacement for Java" as Scala, and the momentum behind Scala is now unquestionable. – Charlies Nutter, JRuby lead http://blog.headius.com/2009/04/future-part-one.html My tip though for the long term replacement of javac is Scala. I'm very impressed with it! I can honestly say if someone had shown me the Programming in Scala book […] back in 2003 I'd probably have never created Groovy. – James Strachan, creator of Groovy http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html
  • 2. Agenda
    • Background and motivation
    • 3. Intro to Scala
      • Basic syntax
      • 4. Pattern matching
      • 5. Functions
      • 6. Classes and traits
    • <break />
    • 7. Practical Scala
  • 8. About us
    • Alf Kristian Støyle and Fredrik Vraalsen
    • 9. Java developers with 6 and 9 years experience
    • 10. Scala enthusiasts since 2008
    • 11. Developed SubmitIT for JavaZone
    • 12. Alf worked on Scala application for Kommuneforlaget
    • 13. Held 4 Scala training courses for 60+ participants
  • 14.  
  • 15. public class Person { private int age ; private String name ; public Person( int age, String name) { this . age = age; this . name = name; } public int getAge() { return this . age ; } public void setAge( int age) { this . age = age; } public String getName() { return this . name ; } public void setName(String name) { this . name = name; } } class Person ( var age : Int , var name : String )
  • 16. List<Person> persons = ... List<Person> adults = new LinkedList<Person>(); List<Person> kids = new LinkedList<Person>(); for (Person person : persons) { if (person.getAge() < 18) { kids.add(person); } else { adults.add(person); } } val persons : List [ Person ] = ... val ( kids , adults ) = persons . partition (_. age < 18)
  • 17. using ( new BufferedReader ( new FileReader ( &quot;f.txt&quot; ))) { reader => println ( reader . readLine() ) } BufferedReader reader = null ; try { reader = new BufferedReader( new FileReader( &quot;f.txt&quot; )); System. out .println(reader.readLine()); } finally { if (reader != null ) { try { reader.close(); } catch (IOException e) { // Exception on close, ignore } } }
  • 18. Scala
    • Object oriented and functional
    • 19. Statically typed
    • 20. Java compatible
      • Compiles to Java bytecode
      • 21. Existing libraries/frameworks
    • Better Java
  • 22. ;
  • 23. public class Person { private int age ; private String name ; public Person( int age, String name) { this . age = age; this . name = name; } public int getAge() { return this . age ; } public void setAge( int age) { this . age = age; } public String getName() { return this . name ; } public void setName(String name) { this . name = name; } }
  • 24. public class Person { private int age private String name public Person( int age, String name) { this . age = age this . name = name } public int getAge() { return this . age } public void setAge( int age) { this . age = age } public String getName() { return this . name } public void setName(String name) { this . name = name } }
  • 25. Variables var i : Int = 42
  • 26. Variables var i = 42 i = 3 i = &quot;Hello world!&quot; // compile error
  • 27. Values val i = 42 i = 3 // compile error
  • 28. Methods def sum ( a : Int , b : Int ): Int = { return a + b }
  • 29. Methods def sum ( a : Int , b : Int ): Int = { a + b }
  • 30. Methods def sum ( a : Int , b : Int ) = { a + b }
  • 31. Methods def sum ( a : Int , b : Int ) = a + b
  • 32. Methods def sayHello ( name : String ) { println ( &quot;Hello, &quot; + name ) }
  • 33. Methods &quot;apple&quot; . charAt (0) &quot;apple&quot; charAt 0 1.0.+(2.0) 1.0 + 2.0
  • 34. Collections val list = List ( &quot;apple&quot; , &quot;orange&quot; , &quot;banana&quot; ) val map = Map (1 -> &quot;one&quot; , 2 -> &quot;two&quot; ) val array = Array (1, 2, 3, 4, 5) list (1) // orange map (2) // two array (3) // 4
  • 35. myObject match { case 1 => println ( &quot;First&quot; ) case 2 => println ( &quot;Second&quot; ) case _ => println ( &quot;Unknown&quot; ) } Pattern matching
  • 36. myObject match { case i : Int => println ( &quot;Found number &quot; + i ) case s : String => println ( &quot;Found text &quot; + s ) case _ => println ( &quot;Unknown&quot; ) } Pattern matching
  • 37. val email = &quot;&quot;&quot; (.+) @ (.+) &quot;&quot;&quot; . r &quot; scala @ java.no &quot; match { case email ( name , domain ) => println ( &quot;User &quot; + name + &quot; at &quot; + domain ) case x => println ( x + &quot; is not an email&quot; ) } Pattern matching
  • 38. val numbers = List (1, 2, 3) val secondNumber = numbers match { case List (_, i , _*) => Some ( i ) case _ => None } => secondNumber : Option [ Int ] = Some (2) Pattern matching
  • 39. Functions Predicate <Integer> even = new Predicate <Integer>() { @ Override public boolean apply(Integer i) { return i % 2 == 0; } }; List<Integer> numbers = … // 1, 2, 3, 4 Iterable<Integer> evenNums = Iterables .filter(numbers, even); => [2, 4] Google collections:
  • 40. Functions val even = ( i : Int ) => i % 2 == 0 val numbers = List (1, 2, 3, 4) val evenNums = numbers . filter ( even ) => List(2, 4) Scala collections:
  • 41. Functions val numbers = List (1, 2, 3, 4) val evenNums = numbers . filter (( i : Int ) => i % 2 == 0) => List(2, 4) Scala collections:
  • 42. Functions val numbers = List (1, 2, 3, 4) val evenNums = numbers . filter ( i => i % 2 == 0) => List(2, 4) Scala collections:
  • 43. Functions val numbers = List (1, 2, 3, 4) val evenNums = numbers . filter (_ % 2 == 0) => List(2, 4) Scala collections:
  • 44. Functions Predicate <Integer> even = new Predicate <Integer>() { @ Override public boolean apply(Integer i) { return i % 2 == 0; } }; val numbers = List (1, 2, 3, 4) val evenNums = numbers . filter (_ % 2 == 0) => List(2, 4) Scala collections:
  • 45. Functions #boolean(int) even = #(int i)(i % 2 == 0) JDK7 lambda expressions: val even = ( i : Int ) => i % 2 == 0 Scala functions:
  • 46. Functions Iterables.filter(numbers, #(int i)(i % 2 == 0)) JDK7 lambda expressions: numbers . filter (_ % 2 == 0) Scala functions:
  • 47. Control structures return values val numbers = for ( i <- 1 to 10) yield i val res = if ( cond ) x else y val res2 = try { x } catch { … y } finally { … }
  • 48. Classes and constructors class Person ( val age : Int )
  • 49. Classes and constructors class Person ( val age : Int ) { def this () = this (42) var name : String = _ override def toString = &quot;My name is &quot; + name }
  • 50. Traits (= Interface + Mixin)
    • “Multiple inheritance done right”
    • 51. Implement methods
    • 52. Initialized fields
    • 53. Abstract methods and fields
    • 54. Does not support constructors
    • 55. Call to super -> strict semantics
  • 56. scala.Ordered trait trait Ordered [ A ] { def compare ( that : A ): Int def < ( that : A ): Boolean = ( this compare that ) < 0 def > ( that : A ): Boolean = ( this compare that ) > 0 def <= ( that : A ): Boolean = ( this compare that ) <= 0 def >= ( that : A ): Boolean = ( this compare that ) >= 0 }
  • 57. The Ordered trait class Person ( val age : Int ) extends Ordered [ Person ] { def compare ( other : Person ) = this . age - other . age } val person1 = new Person (21) val person2 = new Person (31) person1 < person2 // true person1 <= person2 // true person1 >= person2 // false
  • 58. “Dynamic mixins” class Person ( val name : String, val age : Int ) { override def toString = &quot;My name is &quot; + name } trait Loud { override def toString = super . toString . toUpperCase } val person = new Person ( &quot;Fredrik&quot; , 18) with Loud println ( person ) => MY NAME IS FREDRIK
  • 59. Just scratching the surface...
  • 67. Q & A
  • 68. val xml = <break time=&quot;15&quot; />
  • 69. Practical Scala
  • 77. IDE support
    • Netbeans - very good, but inferior in other areas
    • 78. IntelliJ IDEA - very good, but slow compilation
    • 79. Eclipse - bad, but very fast when working
  • 80. Backward compatibility
    • Binary compatibility broken several times
    • 81. Think twice before using a library
  • 82. Tools demo
    • REPL - Read eval print loop
    • 83. Maven
    • 84. SBT - Simple Build Tool
    • 85. IntelliJ IDEA
  • 86. JRebel
    • &quot;Complete Java projects 10-23 % faster&quot;
    • 87. Hotswap on steroids
    • 88. Commercial, but free for Scala
  • 89. ScalaTest demo
    • DSL for testing
    • 90. Powerful assertions
    • 91. Different test styles
  • 94. The feel of Scala http://parleys.com/#id=10&st=5&sl=1
  • 95. Java interoperability demo
    • Scala using Java
    • 96. Java using Scala
    • 97. Mixed projects?
  • 98. Learning curve
    • Syntax small smack in the face
    • 99. Easy to write Java-ish Scala
    • 100. The language scales with your understanding
    • 101. Gradually migrate to more functional style
  • 102. What would you like to hear?
    • Functional programming
      • What is it all about?
    • Implicit conversion
      • Why does &quot;gnirtS.gnal.avaj&quot;.reverse work?
    • Higher order functions
      • How does the using/resource handling example work?
  • 103. “Functional programming”
    • First class functions
    • 104. Pattern matching
    • 105. Higher order functions
  • 106. Functional programming
    • Mathematical functions have no side effects
    • 107. f(x) = 2x + 3
  • 108. In practice
    • Only immutable objects (and object graphs)
      • All field must be immutable
      • 109. No side-effects from method calls
      • 110. All methods must return something
  • 111. Example scala.List
    • head :: tail
    val list = List (1, 2) val myList = 1 :: 2 :: Nil // 0 :: 1 :: 2 :: Nil val myotherList = 0 :: myList
  • 112. scala.collection.immutable
    • ...or scala.collection.mutable
    • 113. Pick your poison!
  • 114. Strive to be pure
    • Concurrency
    • 115. Easier to avoid errors
    • 116. Easier to test
  • 117. We have a lot to learn
  • 118. Q & A
  • 119. Resources
    • scala@java.no (http://lister.java.no/mailman/listinfo/scala)
    • 120. http://scala.java.no
    • 121. http://www.slideshare.net/stoyle/scala-intro
    • 122. http://github.com/stoyle/javaBin-demo
    • 123. fredrik@vraalsen.no, alf.kristian@gmail.com