scala - en bedre og mere effektiv java?
Post on 26-May-2015
1.593 Views
Preview:
DESCRIPTION
TRANSCRIPT
- en bedre og mere effektiv Java?
Jesper Kamstrup Linnetjesper@linnet-data.dk
7N IT-konference 20105. maj 2010
Om mig
•Freelancekonsulent
•Java- og .NET-udvikler/arkitekt
•Sprogbegejstret
Agenda
•Hvad er Scala?
•En bedre Java?
•Ready for prime time?
Kort om Scalas historie
•Startet i 2001
•Skabt af Martin Odersky
Hvad er Scala?
En bedre Java?Java Scala
Java++ ?
Er Java dødt som sprog?
Kilde: InfoQ.com
Kendetegn
•Statisk typet
•Skalabilitet i højsædet
=Objektorienteret
+Funktionsorienteret
Hybridsprog
Objektorienteret
1.to(5) Range(1, 2, 3, 4, 5)
Funktionsorienteret
val a = 10
val f = (x: Int) => x + 5
Immutability
•Centralt for funktionsprogrammering
•Vigtigt for parallelisering
•Letter kodelæsning
Hvad gør Scala mere effektivt?
Hello, world
println("Hello, world")
Image: Suat Eman / FreeDigitalPhotos.net
Syntaktisk sukker
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
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);
copy methodSca
la 2.8
val person = Person("Jesper", "Kbh")
Person(Jesper,Aarhus)
val newPerson = person.copy(address = "Aarhus")
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
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)
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
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 }
Operationer på List (1)
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))
Closures
var outside = 5val closure = (i: Int) => i * outside
println(closure(2)) 10
outside = 10println(closure(2)) 20
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")
}
Pattern matching (2)
value match {
case List(1, rest @ _*) => println("1 og flere")case List(_, _) => println("To elementer")
}
Lister
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
Pattern matching (4)
value match { case Person(_, "Kbh") => println("Københavner") case _ => println("Uden for København")}
Case classes
XML (1)
val personsXml = <persons> <person name="Jesper"><age>38</age></person> <person name="Ulla"><age>{age}</age></person> </persons>
XML (2)
val names = personsXml \\ "@name"
val persons = personsXml \ "person"
val name = person \ "@name"
XML (3)
node match { case <name>{name}</name> => println(name) case _ => println("Andet")}
Duck typing
“If it walks like a duck, and quacks like a duck, then it is a duck”
Duck typing
public class Text extends ... { public void setText (String string) {
public class Button extends ... { public void setText (String string) {
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")}
Traits (1)
trait Editable { def isEditable(): Boolean}
class EditablePerson extends Editable { def isEditable() = true}
Som interface
Traits (2)
Definition af mixin
trait Persistable { val entityManager: EntityManager = ...
def save = { entityManager.persist(this) }}
Traits (3)
Statisk brug af mixin
class Car extends Vehicle with Persistable { ...}
val car = new Carcar.save
Traits (4)
Dynamisk brug af mixin
class Bicycle extends Vehicle { ...}
val bicycle = new Bicycle with Persistablebicycle.save
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
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))}
Parallelisering
•Højere abstraktionsniveau
•Aktørmodel
•Beskedudveksling
•Share-nothing
Simpel aktør
import scala.actors.Actor._
actor { calculateStuff}
// stuff in main thread
Beskedudveksling
val parrot = actor { while (true) { receive { case msg => println("Msg: " + msg) } }}
parrot ! "Hello, Polly"
Ready for prime time?
Scala i den virkelige verden
Masser af information
•http://scala-lang.org
•Bøger
•Tutorials og artikler
Hvorfor ikke Scala?
•Ny syntaks
•“Ungt” sprog
•Værktøjsunderstøttelse
Hvorfor Scala?
•Kompatibilitet med Java
•Stærkere syntaks
•I fremgang
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)
Konklusion
En bedre og mere effektiv Java?
Kontakt
•Slides: http://bit.ly/scala-7n
• jesper@linnet-data.dk
• http://twitter.com/jesper_linnet
• http://blog.kamstrup-linnet.dk
Spørgsmål?
- en bedre og mere effektiv Java?
Jesper Kamstrup Linnetjesper@linnet-data.dk
7N IT-konference 20105. maj 2010
top related