Introduction to Scala for Java Developers
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Introduction to Scala for Java Developers

  • 15,911 views
Uploaded 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.

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.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • 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.
    Are you sure you want to
    Your message goes here
  • XML has got language level support in Scala. No DSL stuff there.
    Are you sure you want to
    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.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
15,911
On Slideshare
14,702
From Embeds
1,209
Number of Embeds
20

Actions

Shares
Downloads
635
Comments
3
Likes
29

Embeds 1,209

http://blog.chrissom.com 803
http://mahananda 118
http://fupeg.blogspot.com 101
http://www.slideshare.net 72
http://cyanhui.blogspot.com 49
http://localhost 19
http://socialmedia4sme.blogspot.com 12
http://www.brijj.com 8
http://www.linkedin.com 8
http://tumble.dshaw.com 4
http://static.slideshare.net 3
http://cyanhui.blogspot.co.uk 2
http://paper.li 2
http://bagtheweb.com 2
http://cyanhui.blogspot.cz 1
http://cyanhui.blogspot.de 1
http://mahananda.gslab.com 1
http://webcache.googleusercontent.com 1
http://year2013.blogspot.com 1
https://www.linkedin.com 1

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. Scala for Java Developers Michael Galpin, http://fupeg.blogspot.com Tuesday, January 13, 2009
  • 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. Scala is General Purpose Some uses of Scala ✤ Scripting ✤ Web applications ✤ Messaging ✤ Graphical User Interfaces ✤ Tuesday, January 13, 2009
  • 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. Scala is Statically Typed var name :String = quot;Hello, worldquot; ; Tuesday, January 13, 2009
  • 6. Scala is Statically Typed var name = quot;Hello, worldquot; ; Tuesday, January 13, 2009
  • 7. Scala is Statically Typed var name = quot;Hello, worldquot; Tuesday, January 13, 2009
  • 8. Scala is Statically Typed val name = quot;Hello, worldquot; Tuesday, January 13, 2009
  • 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. 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. 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. 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. Scala is Statically Typed val name = quot;Hello, worldquot; def makeList(a:String, b:String) = a :: b :: Nil Tuesday, January 13, 2009
  • 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. 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. Scala has More Effective Java Tuesday, January 13, 2009
  • 17. Scala has More Effective Java You always override equals, hashCode, and toString ... right? ✤ Tuesday, January 13, 2009
  • 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. 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. No Operators, Just Methods Tuesday, January 13, 2009
  • 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. 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. Great for DSLs Domain Specific Languages ✤ XML ✤ Actors ✤ Tuesday, January 13, 2009
  • 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. 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. 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. 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. 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. 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. 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. Closure Examples Tuesday, January 13, 2009
  • 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. 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. 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. 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. 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. Closures: Not Just for Golf Tuesday, January 13, 2009
  • 38. Closures: Not Just for Golf var nums = 1 until 100 filter(_ % 3 == 0) Tuesday, January 13, 2009
  • 39. Closures: Not Just for Golf var nums = 1 until 100 filter(_ % 3 == 0) nums.foreach(println(_)) Tuesday, January 13, 2009
  • 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. 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. 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. Scala: A Scalable Language Compiles to bytecode ✤ Very close to “native” Java ✤ Sometimes faster! ✤ Tail recursion ✤ Concurrency ✤ Tuesday, January 13, 2009
  • 44. Scala: Better Bytecode What is the first triangle number to have at least N divisors? Time N Tuesday, January 13, 2009
  • 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. 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. And the Results... Factorial 100000 75000 Time(ms) 50000 25000 0 10000 20000 30000 50000 N Java Scala Tuesday, January 13, 2009
  • 48. Scala Concurrency: Actors Tuesday, January 13, 2009
  • 49. Scala Concurrency: Actors Actor Model: A Different Way to Implement Concurrency ✤ Tuesday, January 13, 2009
  • 50. Scala Concurrency: Actors Actor Model: A Different Way to Implement Concurrency ✤ Each Object is an Actor ✤ Tuesday, January 13, 2009
  • 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. 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. 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. Why Actors: Performance Apache (C/Threads) vs. Yaws (Erlang/Actors) Throughput (KB/s) Concurrent Sessions Tuesday, January 13, 2009
  • 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. 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. 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. 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