Your SlideShare is downloading. ×
0
Scala for Java Developers
    Michael Galpin, http://fupeg.blogspot.com




Tuesday, January 13, 2009
Scala is...

         A general purpose programming language
    ✤




         A language that runs on the Java VM
    ✤
...
Scala is General Purpose


         Some uses of Scala
    ✤




               Scripting
          ✤




               W...
Scala runs on the JVM


         Compiles to Java bytecode
    ✤




               Written by Martin Odersky (javac)
    ...
Scala is Statically Typed

                            var name :String = quot;Hello, worldquot; ;




Tuesday, January 13...
Scala is Statically Typed

                            var name = quot;Hello, worldquot; ;




Tuesday, January 13, 2009
Scala is Statically Typed

                            var name = quot;Hello, worldquot;




Tuesday, January 13, 2009
Scala is Statically Typed

                            val name = quot;Hello, worldquot;




Tuesday, January 13, 2009
Scala is Statically Typed

                                  val name = quot;Hello, worldquot;




                       ...
Scala is Statically Typed

                                  val name = quot;Hello, worldquot;




                       ...
Scala is Statically Typed

                                   val name = quot;Hello, worldquot;




                      ...
Scala is Statically Typed

                                  val name = quot;Hello, worldquot;




                       ...
Scala is Statically Typed

                                  val name = quot;Hello, worldquot;




                       ...
Scala is object-oriented


         Classes
    ✤



         class Computer (val clockSpeed:Double, var memory:Int, var h...
Scala is object-oriented

         Inheritance
    ✤
         class Laptop(clockSpeed:Double, memory:Int, hdd:Int, val scr...
Scala has More Effective Java




Tuesday, January 13, 2009
Scala has More Effective Java


         You always override equals, hashCode, and toString ... right?
    ✤




Tuesday, ...
Scala has More Effective Java


         You always override equals, hashCode, and toString ... right?
    ✤




         ...
Scala is very object-oriented

         No primitives
    ✤




               No int, just Int
          ✤




          ...
No Operators, Just Methods




Tuesday, January 13, 2009
No Operators, Just Methods



         Dots and parentheses are optional
    ✤
         val x = 1.+(2)
         val y = 1 ...
No Operators, Just Methods



         Dots and parentheses are optional
    ✤
         val x = 1.+(2)
         val y = 1 ...
Great for DSLs



         Domain Specific Languages
    ✤




               XML
          ✤




               Actors
   ...
XML Example: Atom


 class Entry(var title:String, val link:String, val id:String, var updated:Date, var summary:String){
...
XML Example: Atom
 class Feed(val title:String, val link:String, var updated:Date, val author:String, val id:String){
    ...
XML Example: Atom


              object Atom{
                  def main(args:Array[String]){
                      val f...
XML Example: Atom

        $ scalac Atom.scala
        $ scala Atom
        <feed>
               <title>Programming and P...
Singletons in Scala


         Use object instead of class
    ✤
         object ComputerStore{
             def main(args...
Scala is functional


         A function is an object, its definition is its apply method
    ✤
         object DotProdct{...
Closures


         Functions can be passed as parameters to other functions
    ✤




         Scala allows for inline (a...
Closure Examples




Tuesday, January 13, 2009
Closure Examples
                  class Person(val firstName:String, val middleName:String, var lastName:String){
       ...
Closure Examples
                  class Person(val firstName:String, val middleName:String, var lastName:String){
       ...
Closure Examples
                  class Person(val firstName:String, val middleName:String, var lastName:String){
       ...
Closure Examples
                  class Person(val firstName:String, val middleName:String, var lastName:String){
       ...
Closure Examples
                  class Person(val firstName:String, val middleName:String, var lastName:String){
       ...
Closures: Not Just for Golf




Tuesday, January 13, 2009
Closures: Not Just for Golf
                            var nums = 1 until 100 filter(_ % 3 == 0)




Tuesday, January 13,...
Closures: Not Just for Golf
                            var nums = 1 until 100 filter(_ % 3 == 0)

                       ...
Closures: Not Just for Golf
                            var nums = 1 until 100 filter(_ % 3 == 0)

                       ...
Closures: Not Just for Golf
                            var nums = 1 until 100 filter(_ % 3 == 0)

                       ...
Closures: Not Just for Golf
                            var nums = 1 until 100 filter(_ % 3 == 0)

                       ...
Scala: A Scalable Language


         Compiles to bytecode
    ✤




               Very close to “native” Java
          ...
Scala: Better Bytecode

                 What is the first triangle number to have at least N divisors?
                   ...
Tail Recursion: Scala Factorial

                            object Factorial{
                                val ZERO = ...
And in Java...
                            import java.math.BigInteger;
                            import java.util.Date;...
And the Results...
                                                   Factorial
                       100000




        ...
Scala Concurrency: Actors




Tuesday, January 13, 2009
Scala Concurrency: Actors


         Actor Model: A Different Way to Implement Concurrency
    ✤




Tuesday, January 13, ...
Scala Concurrency: Actors


         Actor Model: A Different Way to Implement Concurrency
    ✤




               Each O...
Scala Concurrency: Actors


         Actor Model: A Different Way to Implement Concurrency
    ✤




               Each O...
Scala Concurrency: Actors


         Actor Model: A Different Way to Implement Concurrency
    ✤




               Each O...
Scala Concurrency: Actors


         Actor Model: A Different Way to Implement Concurrency
    ✤




               Each O...
Why Actors: Performance
                                                Apache (C/Threads) vs. Yaws (Erlang/Actors)
      ...
Why Actors: Simpler Code



         No Code Changes for Multi-threaded vs. Single-threaded
    ✤




         No Mutable ...
Actor Example
     case object Ping
     case object Pong
     case object Stop

     class Pong extends Actor {
         ...
Actor Example
     class Ping(count: Int, pong: Actor) extends Actor {
         def act(){
             var pingsLeft = co...
Actor Example
     object PingPong {
         def main(args:Array[String]){
           val pong = new Pong
           val ...
Upcoming SlideShare
Loading in...5
×

Introduction to Scala for Java Developers

10,484

Published on

This is brief presentation on the Scala programming language. It is aimed at Java developers who are curious about Scala. It was given at a San Francisco Java User Group in January 2009.

Published in: Technology
3 Comments
29 Likes
Statistics
Notes
  • For the example on slide #45:

    1. You can write ` val ZERO = BigInt(0) ` instead of ` val ZERO = BigInt.int2bigInt(0) `

    2. Scala naming convention dicates that constants should be named in PascalCase, not UPPERCASE. i.e. Zero in place of ZERO and One in place of ONE.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • XML has got language level support in Scala. No DSL stuff there.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • The factorial example at the time of this comment is doing the recursive call as 'n * factorial(n-1)'. This is not tail recursion. Tail recursion is when you can forget about the caller’s stack when invoking the recursive call. This is not the case in the example code because ’n’ needs to be retained to be multiplied by the result of the recursion. To get tail recursion, factorial needs a helper method that has another argument to accumulate the result. Then the recursion call is factorial_helper(n * result, n - 1). Also, scala does not optimize tail recursion for public methods since there’s no distinction between a call made from within the method to one made from outside. So the helper method needs to be inner to the factorial method.
    With that, I’m surprised the scala version was faster.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
10,484
On Slideshare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
636
Comments
3
Likes
29
Embeds 0
No embeds

No notes for slide

Transcript of "Introduction to Scala for Java Developers"

  1. 1. Scala for Java Developers Michael Galpin, http://fupeg.blogspot.com Tuesday, January 13, 2009
  2. 2. Scala is... A general purpose programming language ✤ A language that runs on the Java VM ✤ Statically typed ✤ An object-oriented language ✤ No primitives or operators, but with singletons ✤ A functional language ✤ A scalable language ✤ Tuesday, January 13, 2009
  3. 3. Scala is General Purpose Some uses of Scala ✤ Scripting ✤ Web applications ✤ Messaging ✤ Graphical User Interfaces ✤ Tuesday, January 13, 2009
  4. 4. Scala runs on the JVM Compiles to Java bytecode ✤ Written by Martin Odersky (javac) ✤ Uses core Java heavily ✤ Can call any Java classes ✤ Can be called by any Java class ✤ Tuesday, January 13, 2009
  5. 5. Scala is Statically Typed var name :String = quot;Hello, worldquot; ; Tuesday, January 13, 2009
  6. 6. Scala is Statically Typed var name = quot;Hello, worldquot; ; Tuesday, January 13, 2009
  7. 7. Scala is Statically Typed var name = quot;Hello, worldquot; Tuesday, January 13, 2009
  8. 8. Scala is Statically Typed val name = quot;Hello, worldquot; Tuesday, January 13, 2009
  9. 9. Scala is Statically Typed val name = quot;Hello, worldquot; def makeList(a:String, b:String):List[String] = { return a :: b :: Nil ; } Tuesday, January 13, 2009
  10. 10. Scala is Statically Typed val name = quot;Hello, worldquot; def makeList(a:String, b:String):List[String] = { return a :: b :: Nil } Tuesday, January 13, 2009
  11. 11. Scala is Statically Typed val name = quot;Hello, worldquot; def makeList(a:String, b:String):List[String] = { a :: b :: Nil } Tuesday, January 13, 2009
  12. 12. Scala is Statically Typed val name = quot;Hello, worldquot; def makeList(a:String, b:String):List[String] = a :: b :: Nil Tuesday, January 13, 2009
  13. 13. Scala is Statically Typed val name = quot;Hello, worldquot; def makeList(a:String, b:String) = a :: b :: Nil Tuesday, January 13, 2009
  14. 14. Scala is object-oriented Classes ✤ class Computer (val clockSpeed:Double, var memory:Int, var hdd:Int, var os:String){ def this(clockSpeed:Double) = this(clockSpeed, 0, 0, null) def addMemory(newRam:Int):Unit = { this.memory += newRam } def addDrive(newHdd:Int) = { this.hdd += newHdd } override def toString = clockSpeed + quot; GHz quot; + memory + quot; GB RAM quot; + hdd + quot; GB hdd quot; + os } Tuesday, January 13, 2009
  15. 15. Scala is object-oriented Inheritance ✤ class Laptop(clockSpeed:Double, memory:Int, hdd:Int, val screenSize:Int, os:String) extends Computer(clockSpeed,memory,hdd,os){ override def toString = screenSize + quot; inch screen quot; + super.toString } Mix-ins ✤ trait Mac{ var osVersion:String def osx = { osVersion match { case quot;10.5quot; => quot;Leopardquot; case quot;10.4quot; => quot;Tigerquot; case _ => quot;OSXquot; } } } class MacBook(clockSpeed:Double, memory:Int, hdd:Int, os:String) extends Laptop(clockSpeed, memory, hdd, 13, os) with Mac{ var osVersion = os } Tuesday, January 13, 2009
  16. 16. Scala has More Effective Java Tuesday, January 13, 2009
  17. 17. Scala has More Effective Java You always override equals, hashCode, and toString ... right? ✤ Tuesday, January 13, 2009
  18. 18. Scala has More Effective Java You always override equals, hashCode, and toString ... right? ✤ Case Classes ✤ case class Player(val name:String, val team:String, val position:String) val tebow = Player(quot;Tim Tebowquot;,quot;Floridaquot;,quot;QBquot;) println(tebow) // prints (Time Tebow,Florida,QB) val clone = Player(quot;Tim Tebowquot;,quot;Floridaquot;,quot;QBquot;) println(clone == tebow) // prints true val set = new HashSet[Player] set += tebow set += clone println(set.size) // prints 1 Tuesday, January 13, 2009
  19. 19. Scala is very object-oriented No primitives ✤ No int, just Int ✤ No String[], just Array[String] ✤ No operators ✤ + - * / ++ += are all just methods ✤ Create your own or overload (if not final) ✤ Tuesday, January 13, 2009
  20. 20. No Operators, Just Methods Tuesday, January 13, 2009
  21. 21. No Operators, Just Methods Dots and parentheses are optional ✤ val x = 1.+(2) val y = 1 + 2 println(x == y) // prints true Tuesday, January 13, 2009
  22. 22. No Operators, Just Methods Dots and parentheses are optional ✤ val x = 1.+(2) val y = 1 + 2 println(x == y) // prints true Sweet Syntactic Sugar ✤ val cache = new HashMap[String, String] cache += (quot;fooquot;,quot;barquot;) cache -= quot;fooquot; Tuesday, January 13, 2009
  23. 23. Great for DSLs Domain Specific Languages ✤ XML ✤ Actors ✤ Tuesday, January 13, 2009
  24. 24. XML Example: Atom class Entry(var title:String, val link:String, val id:String, var updated:Date, var summary:String){ def toAtom = <entry> <link href={link}/> <id>{id}</id> <updated>{updated}</updated> <summary>{summary}</summary> </entry> } Tuesday, January 13, 2009
  25. 25. XML Example: Atom class Feed(val title:String, val link:String, var updated:Date, val author:String, val id:String){ var entries:List[Entry] = Nil def addEntry(entry:Entry){ entries = entry :: entries } def toAtom = <feed> <title>{title}</title> <link href={link}/> <updated>{updated}</updated> <author> <name>{author}</name> </author> <id>{id}</id> { val nodes = new NodeBuffer for (entry <- entries) { nodes &+ entry.toAtom } nodes } </feed> } Tuesday, January 13, 2009
  26. 26. XML Example: Atom object Atom{ def main(args:Array[String]){ val f = new Feed(quot;Programming and Politicsquot;, quot;http://fupeg.blogspot.comquot;, new Date(),quot;Michel Galpinquot;,quot;5819005quot;) val e = new Entry(quot;New Scala Articlequot;, quot;http://fupeg.blogspot.com/2008/04/new-scala-article.htmlquot;, quot;6009113042595594848quot;, new Date(), quot;Article on Scala and XMLquot; ) f.addEntry(e) println(f.toAtom) } } Tuesday, January 13, 2009
  27. 27. XML Example: Atom $ scalac Atom.scala $ scala Atom <feed> <title>Programming and Politics</title> <link href=quot;http://fupeg.blogspot.comquot;></link> <updated>Tue Jan 13 11:35:51 PST 2009</updated> <author> <name>Michel Galpin</name> </author> <id>5819005</id> <entry> <link href=quot;http://fupeg.blogspot.com/2008/04/new-scala-article.htmlquot;></link> <id>6009113042595594848</id> <updated>Tue Jan 13 11:35:51 PST 2009</updated> <summary>Scala is good</summary> </entry> </feed> Tuesday, January 13, 2009
  28. 28. Singletons in Scala Use object instead of class ✤ object ComputerStore{ def main(args:Array[String]) = { val newton = new MacBook(2.0, 2048, 120, quot;10.5quot;) println(newton.clockSpeed + quot; is fast!quot;) println(quot;newton is running quot; + newton.osx) } } Often used as factories a.k.a. companion objects ✤ val names = List(quot;Billquot;, quot;Davidquot;, quot;Michaelquot;) Tuesday, January 13, 2009
  29. 29. Scala is functional A function is an object, its definition is its apply method ✤ object DotProdct{ def apply(list1:List[Number], list2:[Number]) = { var result = 0 for (i <- 0 until list1.size){ result += list1(i)*list2(i) } result } } val a = List(1,2,3) val b = List(4,5,6) println(DotProduct(a,b)) // prints 32 Tuesday, January 13, 2009
  30. 30. Closures Functions can be passed as parameters to other functions ✤ Scala allows for inline (anonymous) functions ✤ Still statically typed ✤ Lexically scoped (anonymous or not) ✤ Tuesday, January 13, 2009
  31. 31. Closure Examples Tuesday, January 13, 2009
  32. 32. Closure Examples class Person(val firstName:String, val middleName:String, var lastName:String){ def print( formatter:(String,String,String) => String )={ val str = formatter(firstName,middleName,lastName) println(str) } } Tuesday, January 13, 2009
  33. 33. Closure Examples class Person(val firstName:String, val middleName:String, var lastName:String){ def print( formatter:(String,String,String) => String )={ val str = formatter(firstName,middleName,lastName) println(str) } } val p = new Person(quot;Michaelquot;,quot;Davidquot;,quot;Galpinquot;) Tuesday, January 13, 2009
  34. 34. Closure Examples class Person(val firstName:String, val middleName:String, var lastName:String){ def print( formatter:(String,String,String) => String )={ val str = formatter(firstName,middleName,lastName) println(str) } } val p = new Person(quot;Michaelquot;,quot;Davidquot;,quot;Galpinquot;) val sep = quot; quot; def std(a:String,b:String,c:String) = List(a,b,c).mkString(sep) p.print(std) Tuesday, January 13, 2009
  35. 35. Closure Examples class Person(val firstName:String, val middleName:String, var lastName:String){ def print( formatter:(String,String,String) => String )={ val str = formatter(firstName,middleName,lastName) println(str) } } val p = new Person(quot;Michaelquot;,quot;Davidquot;,quot;Galpinquot;) val sep = quot; quot; def std(a:String,b:String,c:String) = List(a,b,c).mkString(sep) p.print(std) val sep2 = quot;:quot; p.print( (a,b,c) => a + sep + b + sep2 + c) Tuesday, January 13, 2009
  36. 36. Closure Examples class Person(val firstName:String, val middleName:String, var lastName:String){ def print( formatter:(String,String,String) => String )={ val str = formatter(firstName,middleName,lastName) println(str) } } val p = new Person(quot;Michaelquot;,quot;Davidquot;,quot;Galpinquot;) val sep = quot; quot; def std(a:String,b:String,c:String) = List(a,b,c).mkString(sep) p.print(std) val sep2 = quot;:quot; p.print( (a,b,c) => a + sep + b + sep2 + c) p.print(_ + sep + _ + sep2 + _) Tuesday, January 13, 2009
  37. 37. Closures: Not Just for Golf Tuesday, January 13, 2009
  38. 38. Closures: Not Just for Golf var nums = 1 until 100 filter(_ % 3 == 0) Tuesday, January 13, 2009
  39. 39. Closures: Not Just for Golf var nums = 1 until 100 filter(_ % 3 == 0) nums.foreach(println(_)) Tuesday, January 13, 2009
  40. 40. Closures: Not Just for Golf var nums = 1 until 100 filter(_ % 3 == 0) nums.foreach(println(_)) nums = nums.map(2*_ + 3) println(quot;All greater than 10? quot; + nums.forall(_ > 10)) Tuesday, January 13, 2009
  41. 41. Closures: Not Just for Golf var nums = 1 until 100 filter(_ % 3 == 0) nums.foreach(println(_)) nums = nums.map(2*_ + 3) println(quot;All greater than 10? quot; + nums.forall(_ > 10)) val sum = nums.foldLeft(0)(_+_) println(quot;sum=quot;+sum) Tuesday, January 13, 2009
  42. 42. Closures: Not Just for Golf var nums = 1 until 100 filter(_ % 3 == 0) nums.foreach(println(_)) nums = nums.map(2*_ + 3) println(quot;All greater than 10? quot; + nums.forall(_ > 10)) val sum = nums.foldLeft(0)(_+_) println(quot;sum=quot;+sum) val sorted = nums.toList.sort( (n,m) => { val remN = n % 5 val remM = m % 5 remN > remM }) sorted.foreach( (i) => println(i + quot; quot; + i % 5)) Tuesday, January 13, 2009
  43. 43. Scala: A Scalable Language Compiles to bytecode ✤ Very close to “native” Java ✤ Sometimes faster! ✤ Tail recursion ✤ Concurrency ✤ Tuesday, January 13, 2009
  44. 44. Scala: Better Bytecode What is the first triangle number to have at least N divisors? Time N Tuesday, January 13, 2009
  45. 45. Tail Recursion: Scala Factorial object Factorial{ val ZERO = BigInt.int2bigInt(0) val ONE = BigInt.int2bigInt(1) def factorial(n:BigInt):BigInt= n match { case ZERO => ONE case ONE => ONE case _ => n*factorial(n-1) } def main(args:Array[String]){ val i = args(0).toInt val n = BigInt.int2bigInt(i) val start = new java.util.Date println(factorial(n)) val duration = (new java.util.Date()).getTime - start.getTime println(quot;duration=quot;+duration) } } Tuesday, January 13, 2009
  46. 46. And in Java... import java.math.BigInteger; import java.util.Date; public class Factorial{ public static BigInteger factorial(BigInteger n){ if (n.equals(BigInteger.ZERO)) return BigInteger.ONE; else if (n.equals(BigInteger.ONE)) return BigInteger.ONE; else return n.multiply(factorial(n.subtract(BigInteger.ONE))); } public static void main(String[] args){ BigInteger n = new BigInteger(args[0]); Date start = new Date(); System.out.println(factorial(n)); long duration = (new Date()).getTime() - start.getTime(); System.out.println(quot;duration=quot;+duration); } } Tuesday, January 13, 2009
  47. 47. And the Results... Factorial 100000 75000 Time(ms) 50000 25000 0 10000 20000 30000 50000 N Java Scala Tuesday, January 13, 2009
  48. 48. Scala Concurrency: Actors Tuesday, January 13, 2009
  49. 49. Scala Concurrency: Actors Actor Model: A Different Way to Implement Concurrency ✤ Tuesday, January 13, 2009
  50. 50. Scala Concurrency: Actors Actor Model: A Different Way to Implement Concurrency ✤ Each Object is an Actor ✤ Tuesday, January 13, 2009
  51. 51. Scala Concurrency: Actors Actor Model: A Different Way to Implement Concurrency ✤ Each Object is an Actor ✤ Each Actor has a Mailbox ✤ Tuesday, January 13, 2009
  52. 52. Scala Concurrency: Actors Actor Model: A Different Way to Implement Concurrency ✤ Each Object is an Actor ✤ Each Actor has a Mailbox ✤ Actors (Asynchronously) Send Messages and Receive them in their ✤ Mailbox Tuesday, January 13, 2009
  53. 53. Scala Concurrency: Actors Actor Model: A Different Way to Implement Concurrency ✤ Each Object is an Actor ✤ Each Actor has a Mailbox ✤ Actors (Asynchronously) Send Messages and Receive them in their ✤ Mailbox No Shared State ✤ Tuesday, January 13, 2009
  54. 54. Why Actors: Performance Apache (C/Threads) vs. Yaws (Erlang/Actors) Throughput (KB/s) Concurrent Sessions Tuesday, January 13, 2009
  55. 55. Why Actors: Simpler Code No Code Changes for Multi-threaded vs. Single-threaded ✤ No Mutable State ✤ No (Dead) Locking ✤ Tuesday, January 13, 2009
  56. 56. Actor Example case object Ping case object Pong case object Stop class Pong extends Actor { def act() { var pongCount = 0 loop { react { case Ping => if (pongCount % 1000 == 0) // print every 1000th Ping println(quot;Pong: ping quot;+pongCount) sender ! Pong pongCount = pongCount + 1 case Stop => println(quot;Pong: stopquot;) exit() } } } } Tuesday, January 13, 2009
  57. 57. Actor Example class Ping(count: Int, pong: Actor) extends Actor { def act(){ var pingsLeft = count - 1 pong ! Ping loop{ react { case Pong => if (pingsLeft % 1000 == 0) // print every 1000th Pong println(quot;Ping: pongquot;) if (pingsLeft > 0){ pong ! Ping pingsLeft -= 1 } else { println(quot;Ping: stopquot;) pong ! Stop exit() } } } } } Tuesday, January 13, 2009
  58. 58. Actor Example object PingPong { def main(args:Array[String]){ val pong = new Pong val ping = new Ping(100000, pong) ping.start pong.start } } Tuesday, January 13, 2009
  1. A particular slide catching your eye?

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

×