scala - en bedre og mere effektiv java?

Post on 26-May-2015

1.593 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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.

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?

Spørgsmål?

- en bedre og mere effektiv Java?

Jesper Kamstrup Linnetjesper@linnet-data.dk

7N IT-konference 20105. maj 2010

top related