Download - Scala - en bedre Java?
![Page 2: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/2.jpg)
Om mig
•Freelancekonsulent
•Java- og .NET-udvikler/arkitekt
•Sprogbegejstret
![Page 3: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/3.jpg)
Agenda
•Hvad er Scala?
•En bedre Java?
•Ready for prime time?
![Page 4: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/4.jpg)
Er Java dødt som sprog?
Kilde: InfoQ.com
![Page 5: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/5.jpg)
Hvis Java var en bil...
![Page 6: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/6.jpg)
Hvad er Scala?
![Page 7: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/7.jpg)
Kort om Scalas historie
•Startet i 2001
•Skabt af Martin Odersky
![Page 8: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/8.jpg)
Kendetegn
•Statisk typet
•Hybridsprog
•Skalabilitet i højsædet
![Page 9: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/9.jpg)
Java-kompatibelt
• Eksisterende Java API’er
• Afvikles på JVM’en
• Genererer .class-filer
![Page 10: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/10.jpg)
Hvis Scala var en bil...
![Page 11: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/11.jpg)
=Objektorienteret
+Funktionsorienteret
Hybridsprog
![Page 12: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/12.jpg)
Objektorienteret
1.to(5) Range(1, 2, 3, 4, 5)
![Page 13: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/13.jpg)
Funktionsorienteret
val a = 10
val f = (x: Int) => x + 5
![Page 14: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/14.jpg)
Immutability
• Centralt i funktionsprogrammering
• Vigtigt for parallelisering
• Letter kodelæsning
![Page 15: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/15.jpg)
Hvad gør Scala mere effektivt?
![Page 16: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/16.jpg)
Image: Suat Eman / FreeDigitalPhotos.net
Syntaktisk sukker
![Page 17: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/17.jpg)
Hello, world
println("Hello, world")
![Page 18: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/18.jpg)
Kompakt syntaks (1)
public class Person { private final String name; private final String address;
public Person(String name, String address) { this.name = name; this.address = address; }
public String getName() { return name; }
public String getAddress() { return address; }
Javaclass Person( val name: String, val address: String);
Scala
![Page 19: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/19.jpg)
Kompakt syntaks (2)
public class Person { private final String name; private final String address;
public Person(String name, String address) { this.name = name; this.address = address; }
public String getName() { return name; }
public String getAddress() { return address; }
@Override public int hashCode() { ... }
@Override public boolean equals(Object obj) { ... }
@Override public String toString() { ... }
Java Scalacase class Person( name: String, address: String);
![Page 20: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/20.jpg)
Kompakt syntaks (3)
class Car { var driven = 0.0 def drive(distance: Double) = driven += distance def milesDriven = driven * 1.6}
...
val car = new Carcar drive 10
![Page 21: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/21.jpg)
copy methodSca
la 2.8
val person = Person("Jesper", "Kbh")
Person(Jesper,Aarhus)
val newPerson = person.copy(address = "Aarhus")
![Page 22: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/22.jpg)
Collections
val list = List(1,2,3)val map = Map("Jesper" -> 39,"Peter" -> 55)val set = Set(1, 2, 5, 2)val array = Array(1, 2, 3)
![Page 23: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/23.jpg)
Hvad foretrækker du?
List<Integer> numbers = ...
List<Integer> result = new ArrayList<Integer>();for (Integer number : numbers) { if (isEven(number) { result.add(number); }}
Java Scalaval numbers = ...
val result = numbers filter isEven
![Page 24: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/24.jpg)
Anonyme funktioner
val list = List(1,2,3,4)
List(2, 4)
list filter { _ % 2 == 0 }
list filter isEven
list filter { n => n % 2 == 0 }
![Page 25: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/25.jpg)
Eksempler
val list = List(1,2,3,4)
list map (x => x * x) List(1, 4, 9, 16)
list sum 10
list mkString "," 1,2,3,4
list forall { _ < 5 } true
list partition isEven (List(2, 4),List(1, 3))
![Page 26: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/26.jpg)
Pattern matching (1)
case "test" => println("Streng")
value match {case 1 => println("Tal")case i: Int => printf("Tallet %d", i)
case (x, y) => printf("Et par, x=%s, y=%s", x, y)case _ => println("Alt andet")
}
![Page 27: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/27.jpg)
Pattern matching (2)
value match {
case List(1, rest @ _*) => println("1 og flere")case List(_, _) => println("To elementer")
}
Lister
![Page 28: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/28.jpg)
Pattern matching (3)
val Danish = "Hej (.*)".rval English = "Hi, (.*)".r
greeting match { case Danish(name) => printf("Dansk: %s", name) case English(name) => printf("Engelsk: %s", name)}
Regulære udtryk
![Page 29: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/29.jpg)
Pattern matching (4)
value match { case Person(_, "Kbh") => println("Københavner") case _ => println("Uden for København")}
Case classes
![Page 30: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/30.jpg)
XML (1)
val personsXml = <persons> <person name="Jesper"><age>38</age></person> <person name="Ulla"><age>{age}</age></person> </persons>
![Page 31: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/31.jpg)
XML (2)
val names = personsXml \\ "@name"
val persons = personsXml \ "person"
val name = person \ "@name"
![Page 32: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/32.jpg)
XML (3)
node match { case <name>{name}</name> => println(name) case _ => println("Andet")}
![Page 33: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/33.jpg)
Duck typing
“If it walks like a duck, and quacks like a duck, then it is a duck”
![Page 34: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/34.jpg)
Duck typing
public class Text extends ... { public void setText (String string) {
public class Button extends ... { public void setText (String string) {
![Page 35: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/35.jpg)
Duck typing m. Scala
def update(control: { def setText(text: String) }) = { control.setText("Hello, world")}
type ControlWithText = { def setText(text: String) }
def update(control: ControlWithText) = { control.setText("Hello, world")}
![Page 36: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/36.jpg)
Traits (1)
trait Editable { def isEditable(): Boolean}
class EditablePerson extends Editable { def isEditable() = true}
Som interface
![Page 37: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/37.jpg)
Traits (2)
Definition af mixin
trait Persistable { val entityManager: EntityManager = ...
def save = { entityManager.persist(this) }}
![Page 38: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/38.jpg)
Traits (3)
Statisk brug af mixin
class Car extends Vehicle with Persistable { ...}
val car = new Carcar.save
![Page 39: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/39.jpg)
Traits (4)
Dynamisk brug af mixin
class Bicycle extends Vehicle { ...}
val bicycle = new Bicycle with Persistablebicycle.save
![Page 40: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/40.jpg)
Traits (5)
Overstyring trait LoggingCollection extends
java.util.Collection[String] {
abstract override def add(e: String) = { printf("Adding: %s", e) super.add(e) }}
val coll = new java.util.ArrayList[String] with LoggingCollection
![Page 41: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/41.jpg)
Traits (6)
Eksempel: Observer trait Subject { type Observer = { def receiveUpdate(subject:Any) }
private var observers = List[Observer]()
def addObserver(observer:Observer) = observers ::= observer
def notifyObservers = observers foreach (_.receiveUpdate(this))}
![Page 42: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/42.jpg)
Parallelisering
•Højere abstraktionsniveau
•Aktørmodel
•Beskedudveksling
•Share-nothing
![Page 43: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/43.jpg)
Simpel aktør
import scala.actors.Actor._
actor { calculateStuff}
// stuff in main thread
![Page 44: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/44.jpg)
Beskedudveksling
val parrot = actor { while (true) { receive { case msg => println("Msg: " + msg) } }}
parrot ! "Hello, Polly"
![Page 45: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/45.jpg)
Ready for prime time?
![Page 46: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/46.jpg)
Scala i den virkelige verden
![Page 47: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/47.jpg)
Masser af information
•http://scala-lang.org
•Bøger
•Tutorials og artikler
![Page 48: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/48.jpg)
Hvorfor ikke Scala?
•Ny syntaks
•“Ungt” sprog
•Værktøjsunderstøttelse
![Page 49: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/49.jpg)
Hvorfor Scala?
•Kompatibilitet med Java
•Stærkere syntaks
•I fremgang
![Page 50: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/50.jpg)
Hvorfor Scala?
“You only fully comprehend the awesomeness of #scala when after weeks of being pure scala you have to edit some Java again...”
James Strachan (@jstrachan)
![Page 51: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/51.jpg)
En bedre Java?Java Scala
Java++ ?
![Page 52: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/52.jpg)
Konklusion
En bedre og mere effektiv Java?
![Page 53: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/53.jpg)
Spørgsmål?
![Page 54: Scala - en bedre Java?](https://reader035.vdocuments.pub/reader035/viewer/2022062319/55592bf6d8b42a4f3d8b473d/html5/thumbnails/54.jpg)
Kontakt
•Slides: http://bit.ly/scala-cd10
• http://twitter.com/jesper_linnet
• http://blog.kamstrup-linnet.dk