53
- en bedre og mere effektiv Java? Jesper Kamstrup Linnet [email protected] 7N IT-konference 2010 5. maj 2010

Scala - en bedre og mere effektiv Java?

Embed Size (px)

DESCRIPTION

Scala er et Java-relateret, statisk typet programmeringssprog i hastig fremmarch. Sproget kombinerer aspekter fra objekt- og funktionsorienterede sprog og fokuserer på skalerbarhed og effektivitet, både på det kodemæssige og afviklingsmæssige niveau. Syntaksen er elegant og koncis. Samtidig indeholder sproget stærke konstruktioner til understøttelse af parallelle applikationer, der udnytter fremtidens hardwarearkitekturer.

Citation preview

Page 1: Scala - en bedre og mere effektiv Java?

- en bedre og mere effektiv Java?

Jesper Kamstrup [email protected]

7N IT-konference 20105. maj 2010

Page 2: Scala - en bedre og mere effektiv Java?

Om mig

•Freelancekonsulent

•Java- og .NET-udvikler/arkitekt

•Sprogbegejstret

Page 3: Scala - en bedre og mere effektiv Java?

Agenda

•Hvad er Scala?

•En bedre Java?

•Ready for prime time?

Page 4: Scala - en bedre og mere effektiv Java?

Kort om Scalas historie

•Startet i 2001

•Skabt af Martin Odersky

Page 5: Scala - en bedre og mere effektiv Java?

Hvad er Scala?

Page 6: Scala - en bedre og mere effektiv Java?

En bedre Java?Java Scala

Java++ ?

Page 7: Scala - en bedre og mere effektiv Java?

Er Java dødt som sprog?

Kilde: InfoQ.com

Page 8: Scala - en bedre og mere effektiv Java?

Kendetegn

•Statisk typet

•Skalabilitet i højsædet

Page 9: Scala - en bedre og mere effektiv Java?

=Objektorienteret

+Funktionsorienteret

Hybridsprog

Page 10: Scala - en bedre og mere effektiv Java?

Objektorienteret

1.to(5) Range(1, 2, 3, 4, 5)

Page 11: Scala - en bedre og mere effektiv Java?

Funktionsorienteret

val a = 10

val f = (x: Int) => x + 5

Page 12: Scala - en bedre og mere effektiv Java?

Immutability

•Centralt for funktionsprogrammering

•Vigtigt for parallelisering

•Letter kodelæsning

Page 13: Scala - en bedre og mere effektiv Java?

Hvad gør Scala mere effektivt?

Page 14: Scala - en bedre og mere effektiv Java?

Hello, world

println("Hello, world")

Page 15: Scala - en bedre og mere effektiv Java?

Image: Suat Eman / FreeDigitalPhotos.net

Syntaktisk sukker

Page 16: Scala - en bedre og mere effektiv Java?

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 17: Scala - en bedre og mere effektiv Java?

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 18: Scala - en bedre og mere effektiv Java?

copy methodSca

la 2.8

val person = Person("Jesper", "Kbh")

Person(Jesper,Aarhus)

val newPerson = person.copy(address = "Aarhus")

Page 19: Scala - en bedre og mere effektiv Java?

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 20: Scala - en bedre og mere effektiv Java?

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 21: Scala - en bedre og mere effektiv Java?

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 22: Scala - en bedre og mere effektiv Java?

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 23: Scala - en bedre og mere effektiv Java?

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))

Page 24: Scala - en bedre og mere effektiv Java?

Closures

var outside = 5val closure = (i: Int) => i * outside

println(closure(2)) 10

outside = 10println(closure(2)) 20

Page 25: Scala - en bedre og mere effektiv Java?

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 26: Scala - en bedre og mere effektiv Java?

Pattern matching (2)

value match {

case List(1, rest @ _*) => println("1 og flere")case List(_, _) => println("To elementer")

}

Lister

Page 27: Scala - en bedre og mere effektiv Java?

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 28: Scala - en bedre og mere effektiv Java?

Pattern matching (4)

value match { case Person(_, "Kbh") => println("Københavner") case _ => println("Uden for København")}

Case classes

Page 29: Scala - en bedre og mere effektiv Java?

XML (1)

val personsXml = <persons> <person name="Jesper"><age>38</age></person> <person name="Ulla"><age>{age}</age></person> </persons>

Page 30: Scala - en bedre og mere effektiv Java?

XML (2)

val names = personsXml \\ "@name"

val persons = personsXml \ "person"

val name = person \ "@name"

Page 31: Scala - en bedre og mere effektiv Java?

XML (3)

node match { case <name>{name}</name> => println(name) case _ => println("Andet")}

Page 32: Scala - en bedre og mere effektiv Java?

Duck typing

“If it walks like a duck, and quacks like a duck, then it is a duck”

Page 33: Scala - en bedre og mere effektiv Java?

Duck typing

public class Text extends ... { public void setText (String string) {

public class Button extends ... { public void setText (String string) {

Page 34: Scala - en bedre og mere effektiv Java?

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 35: Scala - en bedre og mere effektiv Java?

Traits (1)

trait Editable { def isEditable(): Boolean}

class EditablePerson extends Editable { def isEditable() = true}

Som interface

Page 36: Scala - en bedre og mere effektiv Java?

Traits (2)

Definition af mixin

trait Persistable { val entityManager: EntityManager = ...

def save = { entityManager.persist(this) }}

Page 37: Scala - en bedre og mere effektiv Java?

Traits (3)

Statisk brug af mixin

class Car extends Vehicle with Persistable { ...}

val car = new Carcar.save

Page 38: Scala - en bedre og mere effektiv Java?

Traits (4)

Dynamisk brug af mixin

class Bicycle extends Vehicle { ...}

val bicycle = new Bicycle with Persistablebicycle.save

Page 39: Scala - en bedre og mere effektiv Java?

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 40: Scala - en bedre og mere effektiv Java?

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 41: Scala - en bedre og mere effektiv Java?

Parallelisering

•Højere abstraktionsniveau

•Aktørmodel

•Beskedudveksling

•Share-nothing

Page 42: Scala - en bedre og mere effektiv Java?

Simpel aktør

import scala.actors.Actor._

actor { calculateStuff}

// stuff in main thread

Page 43: Scala - en bedre og mere effektiv Java?

Beskedudveksling

val parrot = actor { while (true) { receive { case msg => println("Msg: " + msg) } }}

parrot ! "Hello, Polly"

Page 44: Scala - en bedre og mere effektiv Java?

Ready for prime time?

Page 45: Scala - en bedre og mere effektiv Java?

Scala i den virkelige verden

Page 46: Scala - en bedre og mere effektiv Java?

Masser af information

•http://scala-lang.org

•Bøger

•Tutorials og artikler

Page 47: Scala - en bedre og mere effektiv Java?

Hvorfor ikke Scala?

•Ny syntaks

•“Ungt” sprog

•Værktøjsunderstøttelse

Page 48: Scala - en bedre og mere effektiv Java?

Hvorfor Scala?

•Kompatibilitet med Java

•Stærkere syntaks

•I fremgang

Page 49: Scala - en bedre og mere effektiv Java?

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 50: Scala - en bedre og mere effektiv Java?

Konklusion

En bedre og mere effektiv Java?

Page 52: Scala - en bedre og mere effektiv Java?

Spørgsmål?

Page 53: Scala - en bedre og mere effektiv Java?

- en bedre og mere effektiv Java?

Jesper Kamstrup [email protected]

7N IT-konference 20105. maj 2010