Transcript
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


Recommended