Advertisement

Scala - en bedre Java?

Software Developer/Architect at Linnet Data
May. 26, 2010
Advertisement

More Related Content

Advertisement

Scala - en bedre Java?

  1. - en bedre Java? Jesper Kamstrup Linnet jesper@linnet-data.dk Community Day 2010 27. maj 2010
  2. Om mig •Freelancekonsulent • Java- og .NET-udvikler/arkitekt • Sprogbegejstret
  3. Agenda •Hvad er Scala? • En bedre Java? • Ready for prime time?
  4. Er Java dødt som sprog? Kilde: InfoQ.com
  5. Hvis Java var en bil...
  6. Hvad er Scala?
  7. Kort om Scalas historie • Startet i 2001 • Skabt af Martin Odersky
  8. Kendetegn •Statisk typet • Hybridsprog • Skalabilitet i højsædet
  9. Java-kompatibelt • Eksisterende Java API’er • Afvikles på JVM’en • Genererer .class-filer
  10. Hvis Scala var en bil...
  11. Hybridsprog = Objektorienteret + Funktionsorienteret
  12. Objektorienteret 1.to(5) Range(1, 2, 3, 4, 5)
  13. Funktionsorienteret val a = 10 val f = (x: Int) => x + 5
  14. Immutability • Centralt i funktionsprogrammering • Vigtigt for parallelisering • Letter kodelæsning
  15. Hvad gør Scala mere effektivt?
  16. Syntaktisk sukker Image: Suat Eman / FreeDigitalPhotos.net
  17. Hello, world println("Hello, world")
  18. Kompakt syntaks (1) Java Scala public class Person { private final String name; class Person( private final String address; val name: String, public Person(String name, val address: String); String address) { this.name = name; this.address = address; } public String getName() { return name; } public String getAddress() { return address; }
  19. Kompakt syntaks (2) Java Scala case class Person( public class Person { private final String name; private final String address; public Person(String name, String address) { this.name = name; name: String, address: String); 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() { ... }
  20. Kompakt syntaks (3) class Car { var driven = 0.0 def drive(distance: Double) = driven += distance def milesDriven = driven * 1.6 } ... val car = new Car car drive 10
  21. copy method ala 2 .8 Sc val person = Person("Jesper", "Kbh") val newPerson = person.copy(address = "Aarhus") Person(Jesper,Aarhus)
  22. 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)
  23. Hvad foretrækker du? Java Scala List<Integer> numbers = ... val numbers = ... List<Integer> result = val result = new ArrayList<Integer>(); numbers filter isEven for (Integer number : numbers) { if (isEven(number) { result.add(number); } }
  24. Anonyme funktioner val list = List(1,2,3,4) list filter isEven List(2, 4) list filter { n => n % 2 == 0 } list filter { _ % 2 == 0 }
  25. 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))
  26. Pattern matching (1) value match { case 1 => println("Tal") case i: Int => printf("Tallet %d", i) case "test" => println("Streng") case (x, y) => printf("Et par, x=%s, y=%s", x, y) case _ => println("Alt andet") }
  27. Pattern matching (2) Lister value match { case List(_, _) => println("To elementer") case List(1, rest @ _*) => println("1 og flere") }
  28. Pattern matching (3) Regulære udtryk val Danish = "Hej (.*)".r val English = "Hi, (.*)".r greeting match { case Danish(name) => printf("Dansk: %s", name) case English(name) => printf("Engelsk: %s", name) }
  29. Pattern matching (4) Case classes value match { case Person(_, "Kbh") => println("Københavner") case _ => println("Uden for København") }
  30. XML (1) val personsXml = <persons> <person name="Jesper"><age>38</age></person> <person name="Ulla"><age>{age}</age></person> </persons>
  31. XML (2) val persons = personsXml "person" val name = person "@name" val names = personsXml "@name"
  32. XML (3) node match { case <name>{name}</name> => println(name) case _ => println("Andet") }
  33. Duck typing “If it walks like a duck, and quacks like a duck, then it is a duck”
  34. Duck typing public class Text extends ... { public void setText (String string) { public class Button extends ... { public void setText (String string) {
  35. 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") }
  36. Traits (1) Som interface trait Editable { def isEditable(): Boolean } class EditablePerson extends Editable { def isEditable() = true }
  37. Traits (2) Definition af mixin trait Persistable { val entityManager: EntityManager = ... def save = { entityManager.persist(this) } }
  38. Traits (3) Statisk brug af mixin class Car extends Vehicle with Persistable { ... } val car = new Car car.save
  39. Traits (4) Dynamisk brug af mixin class Bicycle extends Vehicle { ... } val bicycle = new Bicycle with Persistable bicycle.save
  40. 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
  41. 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)) }
  42. Parallelisering •Højere abstraktionsniveau • Aktørmodel • Beskedudveksling • Share-nothing
  43. Simpel aktør import scala.actors.Actor._ actor { calculateStuff } // stuff in main thread
  44. Beskedudveksling val parrot = actor { while (true) { receive { case msg => println("Msg: " + msg) } } } parrot ! "Hello, Polly"
  45. Ready for prime time?
  46. Scala i den virkelige verden
  47. Masser af information • http://scala-lang.org • Bøger • Tutorials og artikler
  48. Hvorfor ikke Scala? •Ny syntaks • “Ungt” sprog • Værktøjsunderstøttelse
  49. Hvorfor Scala? •Kompatibilitet med Java • Stærkere syntaks • I fremgang
  50. 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)
  51. En bedre Java? Java Scala + ? J av a+
  52. Konklusion En bedre og mere effektiv Java?
  53. Spørgsmål?
  54. Kontakt • Slides: http://bit.ly/scala-cd10 • jesper@linnet-data.dk • http://twitter.com/jesper_linnet • http://blog.kamstrup-linnet.dk
Advertisement