SlideShare a Scribd company logo
- en bedre og mere effektiv Java?

                     Jesper Kamstrup Linnet
                     jesper@linnet-data.dk

                     7N IT-konference 2010
                     5. 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




                  + ?
          J av a+
Er Java dødt som sprog?




                     Kilde: InfoQ.com
Kendetegn


• Statisk typet
• Skalabilitet i højsædet
Hybridsprog

         =
 Objektorienteret
         +
Funktionsorienteret
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")
Syntaktisk sukker




               Image: Suat Eman / FreeDigitalPhotos.net
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;
    }
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() {
	     	      ...
	     }
copy method ala                 2 .8
                                   Sc


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

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

                            Person(Jesper,Aarhus)
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
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?
            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);
	 }
}
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 }
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 = 5
val closure = (i: Int) => i * outside

println(closure(2))                     10


outside = 10
println(closure(2))                     20
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")
}
Pattern matching (2)
                                             Lister
value match {
    case List(_, _) => println("To elementer")
    case List(1, rest @ _*) => println("1 og flere")
}
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)
}
Pattern matching (4)
                                 Case classes


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


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

val persons = personsXml  "person"

val name = person  "@name"




val names = personsXml  "@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)
                          Som interface
trait Editable {
	 def isEditable(): Boolean
}

class EditablePerson extends Editable {
	 def isEditable() = true
}
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 Car
car.save
Traits (4)
              Dynamisk brug af mixin

class Bicycle extends Vehicle {
	 ...
}

val bicycle = new Bicycle with Persistable
bicycle.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 Linnet
                     jesper@linnet-data.dk

                     7N IT-konference 2010
                     5. maj 2010

More Related Content

PDF
Scala - en bedre Java?
PDF
Scala 2013 review
PDF
Meet scala
ODP
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
PDF
Pragmatic Real-World Scala (short version)
PDF
Alternate JVM Languages
PDF
Getting Started With Scala
PDF
ハイブリッド言語Scalaを使う
Scala - en bedre Java?
Scala 2013 review
Meet scala
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
Pragmatic Real-World Scala (short version)
Alternate JVM Languages
Getting Started With Scala
ハイブリッド言語Scalaを使う

What's hot (16)

PDF
Scala collections
PPT
Scala presentation by Aleksandar Prokopec
PDF
Demystifying functional programming with Scala
PDF
ZIO Prelude - ZIO World 2021
PDF
JS OO and Closures
PPTX
Joy of scala
PDF
Be Smart, Constrain Your Types to Free Your Brain!
PPT
An introduction to scala
PPT
Spsl v unit - final
PDF
Getting Started With Scala
PPTX
Benefits of Kotlin
PDF
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
PDF
scalaliftoff2009.pdf
PPTX
ODP
1.2 scala basics
ODP
Meetup slides
Scala collections
Scala presentation by Aleksandar Prokopec
Demystifying functional programming with Scala
ZIO Prelude - ZIO World 2021
JS OO and Closures
Joy of scala
Be Smart, Constrain Your Types to Free Your Brain!
An introduction to scala
Spsl v unit - final
Getting Started With Scala
Benefits of Kotlin
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
scalaliftoff2009.pdf
1.2 scala basics
Meetup slides
Ad

Viewers also liked (6)

PPTX
Acec2014 RALfieProject
PPTX
SPS 2014
PPT
Tiiu Maarja
PPT
JD Edwards - Automate Benefits Enrollment Leveraging ESS Work Files
PPTX
It's No Mystery... Mobile BI Will Rule in 2015
PDF
Study: The Future of VR, AR and Self-Driving Cars
Acec2014 RALfieProject
SPS 2014
Tiiu Maarja
JD Edwards - Automate Benefits Enrollment Leveraging ESS Work Files
It's No Mystery... Mobile BI Will Rule in 2015
Study: The Future of VR, AR and Self-Driving Cars
Ad

Similar to Scala - en bedre og mere effektiv Java? (20)

PDF
Scala @ TechMeetup Edinburgh
PDF
Scala for Java Programmers
KEY
Persistens i scala
PDF
Introduction to Scala
ODP
PPT
Scala uma poderosa linguagem para a jvm
PDF
Workshop Scala
PDF
Stepping Up : A Brief Intro to Scala
ODP
Introducing scala
PDF
Getting Started With Scala
PDF
Scala Bootcamp 1
PPTX
Scala - fra newbie til ninja på en time
PPTX
Scala fundamentals
PPTX
Softshake 2013: 10 reasons why java developers are jealous of Scala developers
KEY
Into Clojure
ODP
2.1 recap from-day_one
ODP
1.2 scala basics
PPT
En nybegynners introduksjon til scalaz
PDF
JavaOne 2013 - Clojure for Java Developers
PDF
An Introduction to Scala for Java Developers
Scala @ TechMeetup Edinburgh
Scala for Java Programmers
Persistens i scala
Introduction to Scala
Scala uma poderosa linguagem para a jvm
Workshop Scala
Stepping Up : A Brief Intro to Scala
Introducing scala
Getting Started With Scala
Scala Bootcamp 1
Scala - fra newbie til ninja på en time
Scala fundamentals
Softshake 2013: 10 reasons why java developers are jealous of Scala developers
Into Clojure
2.1 recap from-day_one
1.2 scala basics
En nybegynners introduksjon til scalaz
JavaOne 2013 - Clojure for Java Developers
An Introduction to Scala for Java Developers

Recently uploaded (20)

PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPT
Teaching material agriculture food technology
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
cuic standard and advanced reporting.pdf
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Empathic Computing: Creating Shared Understanding
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Approach and Philosophy of On baking technology
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
MYSQL Presentation for SQL database connectivity
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Big Data Technologies - Introduction.pptx
Dropbox Q2 2025 Financial Results & Investor Presentation
NewMind AI Weekly Chronicles - August'25 Week I
Teaching material agriculture food technology
Mobile App Security Testing_ A Comprehensive Guide.pdf
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
The Rise and Fall of 3GPP – Time for a Sabbatical?
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Spectral efficient network and resource selection model in 5G networks
cuic standard and advanced reporting.pdf
The AUB Centre for AI in Media Proposal.docx
20250228 LYD VKU AI Blended-Learning.pptx
Empathic Computing: Creating Shared Understanding
Network Security Unit 5.pdf for BCA BBA.
Approach and Philosophy of On baking technology
Per capita expenditure prediction using model stacking based on satellite ima...
MYSQL Presentation for SQL database connectivity

Scala - en bedre og mere effektiv Java?

  • 1. - en bedre og mere effektiv Java? Jesper Kamstrup Linnet jesper@linnet-data.dk 7N IT-konference 2010 5. 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. Kort om Scalas historie • Startet i 2001 • Skabt af Martin Odersky
  • 6. En bedre Java? Java Scala + ? J av a+
  • 7. Er Java dødt som sprog? Kilde: InfoQ.com
  • 8. Kendetegn • Statisk typet • Skalabilitet i højsædet
  • 9. Hybridsprog = Objektorienteret + Funktionsorienteret
  • 10. Objektorienteret 1.to(5) Range(1, 2, 3, 4, 5)
  • 11. Funktionsorienteret val a = 10 val f = (x: Int) => x + 5
  • 12. Immutability • Centralt for funktionsprogrammering • Vigtigt for parallelisering • Letter kodelæsning
  • 13. Hvad gør Scala mere effektivt?
  • 15. Syntaktisk sukker Image: Suat Eman / FreeDigitalPhotos.net
  • 16. 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; }
  • 17. 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() { ... }
  • 18. copy method ala 2 .8 Sc val person = Person("Jesper", "Kbh") val newPerson = person.copy(address = "Aarhus") Person(Jesper,Aarhus)
  • 19. 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
  • 20. 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)
  • 21. 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); } }
  • 22. 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 }
  • 23. 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))
  • 24. Closures var outside = 5 val closure = (i: Int) => i * outside println(closure(2)) 10 outside = 10 println(closure(2)) 20
  • 25. 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") }
  • 26. Pattern matching (2) Lister value match { case List(_, _) => println("To elementer") case List(1, rest @ _*) => println("1 og flere") }
  • 27. 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) }
  • 28. Pattern matching (4) Case classes value match { case Person(_, "Kbh") => println("Københavner") case _ => println("Uden for København") }
  • 29. XML (1) val personsXml = <persons> <person name="Jesper"><age>38</age></person> <person name="Ulla"><age>{age}</age></person> </persons>
  • 30. XML (2) val persons = personsXml "person" val name = person "@name" val names = personsXml "@name"
  • 31. XML (3) node match { case <name>{name}</name> => println(name) case _ => println("Andet") }
  • 32. Duck typing “If it walks like a duck, and quacks like a duck, then it is a duck”
  • 33. Duck typing public class Text extends ... { public void setText (String string) { public class Button extends ... { public void setText (String string) {
  • 34. 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") }
  • 35. Traits (1) Som interface trait Editable { def isEditable(): Boolean } class EditablePerson extends Editable { def isEditable() = true }
  • 36. Traits (2) Definition af mixin trait Persistable { val entityManager: EntityManager = ... def save = { entityManager.persist(this) } }
  • 37. Traits (3) Statisk brug af mixin class Car extends Vehicle with Persistable { ... } val car = new Car car.save
  • 38. Traits (4) Dynamisk brug af mixin class Bicycle extends Vehicle { ... } val bicycle = new Bicycle with Persistable bicycle.save
  • 39. 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
  • 40. 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. Simpel aktør import scala.actors.Actor._ actor { calculateStuff } // stuff in main thread
  • 43. Beskedudveksling val parrot = actor { while (true) { receive { case msg => println("Msg: " + msg) } } } parrot ! "Hello, Polly"
  • 45. Scala i den virkelige verden
  • 46. Masser af information • http://scala-lang.org • Bøger • Tutorials og artikler
  • 47. Hvorfor ikke Scala? •Ny syntaks • “Ungt” sprog • Værktøjsunderstøttelse
  • 48. Hvorfor Scala? •Kompatibilitet med Java • Stærkere syntaks • I fremgang
  • 49. 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)
  • 50. Konklusion En bedre og mere effektiv Java?
  • 51. Kontakt • Slides: http://bit.ly/scala-7n • jesper@linnet-data.dk • http://twitter.com/jesper_linnet • http://blog.kamstrup-linnet.dk
  • 53. - en bedre og mere effektiv Java? Jesper Kamstrup Linnet jesper@linnet-data.dk 7N IT-konference 2010 5. maj 2010