advertisement

Introduction to Scala for Java Developers

50 %
50 %
advertisement
Information about Introduction to Scala for Java Developers
Technology

Published on January 21, 2009

Author: michael.galpin

Source: slideshare.net

Description

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.
advertisement

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 ✤ Statically typed ✤ An object-oriented language ✤ No primitives or operators, but with singletons ✤ A functional language ✤ A scalable language ✤ Tuesday, January 13, 2009

Scala is General Purpose Some uses of Scala ✤ Scripting ✤ Web applications ✤ Messaging ✤ Graphical User Interfaces ✤ Tuesday, January 13, 2009

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

Scala is Statically Typed var name :String = quot;Hello, worldquot; ; Tuesday, January 13, 2009

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; def makeList(a:String, b:String):List[String] = { return a :: b :: Nil ; } Tuesday, January 13, 2009

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

Scala is Statically Typed val name = quot;Hello, worldquot; def makeList(a:String, b:String):List[String] = { a :: b :: Nil } Tuesday, January 13, 2009

Scala is Statically Typed val name = quot;Hello, worldquot; def makeList(a:String, b:String):List[String] = a :: b :: Nil Tuesday, January 13, 2009

Scala is Statically Typed val name = quot;Hello, worldquot; def makeList(a:String, b:String) = a :: b :: Nil Tuesday, January 13, 2009

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

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

Scala has More Effective Java Tuesday, January 13, 2009

Scala has More Effective Java You always override equals, hashCode, and toString ... right? ✤ Tuesday, January 13, 2009

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

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

No Operators, Just Methods Tuesday, January 13, 2009

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

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

Great for DSLs Domain Specific Languages ✤ XML ✤ Actors ✤ Tuesday, January 13, 2009

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

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

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

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

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

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

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

Closure Examples Tuesday, January 13, 2009

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

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

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

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

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

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, 2009

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

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

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

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

Scala: A Scalable Language Compiles to bytecode ✤ Very close to “native” Java ✤ Sometimes faster! ✤ Tail recursion ✤ Concurrency ✤ Tuesday, January 13, 2009

Scala: Better Bytecode What is the first triangle number to have at least N divisors? Time N Tuesday, January 13, 2009

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

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

And the Results... Factorial 100000 75000 Time(ms) 50000 25000 0 10000 20000 30000 50000 N Java Scala Tuesday, January 13, 2009

Scala Concurrency: Actors Tuesday, January 13, 2009

Scala Concurrency: Actors Actor Model: A Different Way to Implement Concurrency ✤ Tuesday, January 13, 2009

Scala Concurrency: Actors Actor Model: A Different Way to Implement Concurrency ✤ Each Object is an Actor ✤ Tuesday, January 13, 2009

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

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

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

Why Actors: Performance Apache (C/Threads) vs. Yaws (Erlang/Actors) Throughput (KB/s) Concurrent Sessions Tuesday, January 13, 2009

Why Actors: Simpler Code No Code Changes for Multi-threaded vs. Single-threaded ✤ No Mutable State ✤ No (Dead) Locking ✤ Tuesday, January 13, 2009

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

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

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

Add a comment

Related presentations

Presentación que realice en el Evento Nacional de Gobierno Abierto, realizado los ...

In this presentation we will describe our experience developing with a highly dyna...

Presentation to the LITA Forum 7th November 2014 Albuquerque, NM

Un recorrido por los cambios que nos generará el wearabletech en el futuro

Um paralelo entre as novidades & mercado em Wearable Computing e Tecnologias Assis...

Microsoft finally joins the smartwatch and fitness tracker game by introducing the...

Related pages

An Introduction to Scala for Java Developers

The Oracle Java Certification exams are very difficult tests on every feature of Java, and obtaining certification gives hiring managers a very ...
Read more

A Scala Tutorial for Java programmers

A Scala Tutorial for Java programmers Version 1.3 ... SWITZERLAND. 2 1Introduction This document gives a quick introduction to the Scala language and ...
Read more

A Scala Tutorial for Java Programmers - Scala Documentation

A Scala Tutorial for Java Programmers. ... By Michel Schinz and Philipp Haller. Introduction. This document gives a quick introduction to the Scala ...
Read more

Scala for Java Developers | Pluralsight

Scala for Java Developers . By Toby Weston. ... Module Introduction 1m 52s Expressive Scala: Faking Function Calls 7m 19s Expressive Scala: ...
Read more

The Scala Programming Language | The Scala Programming ...

Home » About Scala » Introduction. ... critical applications are turning to Scala to boost their development ... Scala from Java and you can ...
Read more

Introduction to Play Framework for Java developers - YouTube

Introduction to Play Framework for Java developers ... Introduction to Views in the ... Introduction to Play Framework for Scala ...
Read more

Introduction to Play Framework for Java developers ...

Introduction to Play Framework for Java developers With Markus Jura Play. ... Introduction to Play Framework for Scala developers with Markus Jura.
Read more

IBM developerWorks : Java Technology : Technical library

It makes sense for Java developers to use objects as a first point of reference for understanding Scala. In this installment, Ted Neward follows a basic ...
Read more