Einführung   in Scala SDC 2011 - Seitenbau Konstanz Christian Baranowski Dennis Braunsdorf
Was ist Scala?
Scala  a Scalable  Language
Scala  Bazaar  Scala = Bazaar Java = Cathedral “ The Cathedral and the Bazaar” - Eric S. Raymond
Warum Scala?
Scala ist objekt-orientiert
Everything is a Object
Scala ist funktional
Scala ist statisch typisiert
Scala Basics
Variablen var  msg =  "Hello SDC!" // Java Code String  msg  =  "Hello World" ; val  msg =  "Hello SDC!“ // Java Code final  String  msg  =  "Hello World" ;
Funktionen def  max(x : Int, y : Int) : Int = { if (x > y) { return  x; } else  { return  y; } }
Funktionen def  max(x : Int, y : Int) : Int = { if (x > y) { x } else  { y } }
Funktionen def  max(x : Int, y : Int) : Int = { if (x > y) x else  y }
Funktionen def  max(x : Int, y : Int) = { if (x > y) x else  y }
Procedure def  printer(msg : String) { ... }
Funktionen Composition and Scoping def  max(x : Int, y : Int) = { def  xGreater() = { x > y  } if (xGreater()) x else  y }
Funktionen Composition and Scoping def  max(x : Int, y : Int) = { def  xGreater() = { x > y  } if (xGreater) x else  y }
Functions are objects def  oncePerSecond(callback: () => Unit) { while  ( true ) { callback(); Thread sleep 1000 } } def  timeFlies() { println( "time flies like an arrow..." ) } oncePerSecond(timeFlies)
Anonymous Functions def  oncePerSecond(callback: () => Unit) { while  ( true ) { callback(); Thread sleep 1000 } } oncePerSecond(() =>  println( "time flies like an arrow..." ))
Arrays val  names =  new  Array[String](2) names(0) =  "Dennis" names(1) =  "Christian"
Arrays val  names = Array( "Dennis" ,  "Christian" )
Arrays val  names = Array( "Dennis" ,  "Christian" ,  true , 0, 1.5) val  names : Array[Any]  = Array( "Dennis" ,  "Christian" ,    true , 0, 1.5)
Listen val  oneTwo = List(1, 2) val  threeFour = List(3, 4) val  oneTwoThreeFour = oneTwo ::: threeFour val  oneTwoThree = 1 :: 2 :: 3 :: Nil
Tuples val  dennis = (1,  "Dennis" ) val  christian = (2,  "Christian" ) val  dennis = ( "Dennis" ,  "Braunsdorf" ) println(dennis._1) println(dennis._2)
Sets
Sets import  scala.collection.mutable.HashSet val  jetSet =  new  HashSet[String] jetSet +=  "Lear" jetSet += ( "Boeing" ,  "Airbus" ) println(jetSet.contains( "Cessna" ))
Sets val  jetSet = Set( "AirBus" ) jetSet: scala.collection.immutable.Set[java.lang.String]
Maps
Maps import  scala.collection.mutable.HashMap val  treasureMap =  new  HashMap[Int, String] treasureMap += 1 ->  "Go to island." treasureMap += 2 ->  "Find big X on ground." treasureMap += 3 ->  "Dig." println(treasureMap(2))
Maps val  treasureMap = Map( (1,  "Go to island." ),  (2,  "Find big X on ground." ),  (3,  "Dig." ) )
While Schleife val  names = Array( &quot;Dennis&quot; ,  &quot;Christian&quot; ) var  i = 0 while (i < names.length) { println(names(i)) i = i + 1 }
For Schleife val  names = Array( &quot;Dennis&quot; ,  &quot;Christian&quot; ) for (name <- names) println(name)
Foreach Collection val  names = Array( &quot;Dennis&quot; ,  &quot;Christian&quot; ) names.foreach(name => println(name))
Throw Exceptions def  max(x : Int, y : Int) : Int = { if (x < 0) throw   new  Exception( &quot;Negativ Int!&quot; ) ... }
Catch Exceptions try  {  ...  }  catch  { case  ioe: IOException  => println( &quot;Fehler beim  lesen auf dem Filesystem&quot; ) case  e: Exception  => println( &quot;Unbekannter Fehler&quot; ) }
Scala OOP Basics
Everything is a Object
Numbers are Objects 1 + 2 * 3 / x = (1).+(((2).*(3))./(x))
Objekte object  DemoService { def  print(msg : String) { println(msg) } } DemoService.print( &quot;Hello World&quot; )
Klassen class  Complex(real: Double, imaginary: Double) { def  re() = real def  im() = imaginary }
Klassen class  Complex(real: Double, imaginary: Double) { def  re = real def  im = imaginary }
Abstrakte Klassen abstract class  Complex(real: Double,  imaginary: Double) { abstract def  re() def  im = imaginary }
Klassen protected class  Complex(real: Double,  imaginary: Double) { private   def  re() = real protected   def  im() = imaginary }
Auxiliary   Constructors class  Complex(real: Double,  imaginary: Double) { def   this () =  this (0,0) def  re() = real def  im() = imaginary }
Packages und Imports package  demo import  javax._ import  scala.collection.mutable.HashMap
Scala Live Demo Getting Started ….
Scala OOP Teil 2
Traits trait  Ord { def  < (that: Any): Boolean def  <=(that: Any): Boolean  = ( this  < that) || ( this  == that) def  > (that: Any): Boolean = !( this  <= that) def  >=(that: Any): Boolean = !( this  < that) } trait  Service class  MyOrd  extends  Ord  with  Service { def  < (that: Any): Boolean =  false   }
Operators + * - /  class  Demo { def  + (x : Int) = 1 + x } var  o1 =  new  MyOrd println(o1 + 1)
Methoden Overloading class  Demo { def  + (x : Int) = 1 + x def  + (x : Demo) = 1 + 1 }
Methoden Überschreiben class  Complex(real: Double, imaginary: Double) { def  re = real def  im = imaginary override   def  toString() =  &quot;&quot;  + re + ( if  (im < 0)  &quot;&quot;   else   &quot;+&quot; ) + im +  &quot;i„ }
Case Klassen abstract   class  Tree case   class  Sum(l: Tree, r: Tree)  extends  Tree case   class  Var(n: String)  extends  Tree case   class  Const(v: Int)  extends  Tree
Pattern Matching def  eval(t: Tree, env: Environment): Int = t  match  { case  Sum(l, r) => eval(l, env) + eval(r, env) case  Var(n) => env(n) case  Const(v) => v } def  derive(t: Tree, v: String): Tree = t  match  { case  Sum(l, r) => Sum(derive(l, v), derive(r, v)) case  Var(n)  if  (v == n) => Const(1) case  _ => Const(0) } val  exp: Tree = Sum(Sum(Var( &quot;x&quot; ),Var( &quot;x&quot; )),Sum(Const(7),Var( &quot;y&quot; ))) val  env: Environment = {  case   &quot;x&quot;  => 5  case   &quot;y&quot;  => 7 } println( &quot;Expression: &quot;  + exp) println( &quot;Evaluation with x=5, y=7: &quot;  + eval(exp, env)) println( &quot;Derivative relative to x:\n &quot;  + derive(exp,  &quot;x&quot; )) println( &quot;Derivative relative to y:\n &quot;  + derive(exp,  &quot;y&quot; ))
Advanced  Features
For-Comprehensions for  (p <- persons  if  p.age > 20)  yield  p.name def  queens(n: Int): List[List[Int]] = { def  placeQueens(k: Int): List[List[Int]] = if  (k == 0) List(List()) else   for  { queens <- placeQueens(k - 1) column <- List.range(1, n + 1) if  isSafe(column, queens, 1) }  yield  column :: queens placeQueens(n) } def  isSafe(col: Int, queens: List[Int], delta: Int): Boolean for  (b <- books; a <- b.authors  if  a startsWith  &quot;Ullman&quot; ) yield  b.title
Genericity class  Reference[T] { private   var  contents: T = _ def  set(value: T) { contents = value } def  get: T = contents } object  IntegerReference { def  main(args: Array[String]) { val  cell =  new  Reference[Int] cell.set(13) println( &quot;Reference contains the half of &quot;   + (cell.get * 2)) } }
Generic Stack abstract   class  Stack[A] { def  push(x: A): Stack[A] =  new  NonEmptyStack[A](x,  this ) def  isEmpty: Boolean def  top: A def  pop: Stack[A] } class  EmptyStack[A]  extends  Stack[A] { def  isEmpty =  true def  top = error( &quot;EmptyStack.top&quot; ) def  pop = error( &quot;EmptyStack.pop&quot; ) } class  NonEmptyStack[A](elem: A, rest: Stack[A])  extends  Stack[A] { def  isEmpty =  false def  top = elem def  pop = rest }
Lazy Values case   class  Employee(id: Int, name: String, managerId: Int) { lazy   val  manager: Employee = Db.get(managerId) lazy   val  team: List[Employee] = Db.team(id) }
Implicit Parameters implicit   object  stringMonoid  extends  Monoid[String] { def  add(x: String, y: String): String = x.concat(y) def  unit: String =  &quot;&quot; } implicit   object  intMonoid  extends  Monoid[Int] { def  add(x: Int, y: Int): Int = x + y def  unit: Int = 0 }
Implicit Conversions implicit   def  int2ordered(x: Int): Ordered[Int] =  new  Ordered[Int] { def  compare(y: Int): Int = if  (x < y) -1 else   if  (x > y) 1 else  0 }
Annotations @field class  BeanProperty  extends  annotation.StaticAnnotation
Scala Java Integration // Java  public   class  MainJava { public   static   void  main(String[] args) { Point point =  new  Point(); point.name(); } } // Scala class  Point(x : Int, y : Int) { var  name =  &quot;Bin ein Point&quot; def   this () =  this (0, 0) override   def  toString = name +  &quot; : x=&quot;  + x +  &quot; : y=&quot;  + y }
Package Objects package   object  demo { implicit   def  toPoint(name: String) =  new  Point }
Scala in Action
Java Beans mit Scala class  PersonBean { @scala.reflect.BeanProperty var  name : String  =  &quot;&quot; }
JUnit Tests with Scala import  org.junit._ import  org.junit.Assert._; class  MaxTest { var  max : MathUtils =  null ; @Before  def  setup(){ max =  new  MathUtils } @Test  def  max_fiveGreaterThenFour() { assertEquals(5, max.max(5, 4)); } }
Scala als DSL Toolkit
Internal DSLs mit Scala
Robot DSL object  DemoRobot  extends  RobotProgram  with  Application { 000 PRINT  &quot;Lunar Mars Program starts.&quot; 001 MOVE(1, 10) 002 SLEEP2000 003 MOVE(10, 10) 004 PRINT &quot;POSITION Now 10, 10&quot; 005 MOVE(20, 20) 006 END RUN }
External DSLs mit Scala
Fragen ?
References Scala –  http://www.scala-lang.org/ Scala IDE -  http://www.scala-ide.org/ Scala Code Snippets http://www.scala-lang.org/node/220 Scala By Example http://www.scala-lang.org/docu/files/ScalaByExample.pdf Scala Tutorial http://www.scala-lang.org/docu/files/ScalaTutorial.pdf Scala Actors -  http://www.scala-lang.org/node/242 Lift  http://liftweb.net

More Related Content

PDF
Hammurabi
PDF
Coding in Style
PPTX
Groovy grails types, operators, objects
PDF
A bit about Scala
PDF
Scala for Jedi
PDF
Developer Experience i TypeScript. Najbardziej ikoniczne duo
PDF
Let the type system be your friend
PDF
响应式编程及框架
Hammurabi
Coding in Style
Groovy grails types, operators, objects
A bit about Scala
Scala for Jedi
Developer Experience i TypeScript. Najbardziej ikoniczne duo
Let the type system be your friend
响应式编程及框架

What's hot (20)

PDF
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
PDF
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
PDF
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
PDF
A tour of Python
PPTX
Scala best practices
PDF
How to Clone Flappy Bird in Swift
PDF
λ | Lenses
PDF
The Macronomicon
PDF
Building fast interpreters in Rust
PDF
Kotlin Basics - Apalon Kotlin Sprint Part 2
KEY
ddd+scala
PDF
Scala vs Java 8 in a Java 8 World
PDF
Grammarware Memes
PDF
Atomically { Delete Your Actors }
PDF
Introduction to Python
ODP
Naïveté vs. Experience
PDF
Beyond Scala Lens
PDF
Scala in practice
KEY
Pyimproved again
PPTX
Concurrent Application Development using Scala
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
A tour of Python
Scala best practices
How to Clone Flappy Bird in Swift
λ | Lenses
The Macronomicon
Building fast interpreters in Rust
Kotlin Basics - Apalon Kotlin Sprint Part 2
ddd+scala
Scala vs Java 8 in a Java 8 World
Grammarware Memes
Atomically { Delete Your Actors }
Introduction to Python
Naïveté vs. Experience
Beyond Scala Lens
Scala in practice
Pyimproved again
Concurrent Application Development using Scala
Ad

Similar to SDC - Einführung in Scala (20)

PPT
JBUG 11 - Scala For Java Programmers
PPTX
Scala - where objects and functions meet
PDF
ODP
Scala introduction
PPTX
Scala en
PPT
Scala presentation by Aleksandar Prokopec
PPT
Functional programming in scala
PPT
Scala for Java Developers
PDF
ハイブリッド言語Scalaを使う
PPTX
Scala: Devnology - Learn A Language Scala
ODP
Scala 2 + 2 > 4
PPTX
A Brief Intro to Scala
PPTX
Practically Functional
ODP
2.1 Recap From Day One
PPTX
Uncover and score the usages of the underscore
PPT
An introduction to scala
PDF
Scala or functional programming from a python developer's perspective
PPTX
Scala in a Java 8 World
PDF
Pragmatic Real-World Scala (short version)
PDF
Pragmatic Real-World Scala
JBUG 11 - Scala For Java Programmers
Scala - where objects and functions meet
Scala introduction
Scala en
Scala presentation by Aleksandar Prokopec
Functional programming in scala
Scala for Java Developers
ハイブリッド言語Scalaを使う
Scala: Devnology - Learn A Language Scala
Scala 2 + 2 > 4
A Brief Intro to Scala
Practically Functional
2.1 Recap From Day One
Uncover and score the usages of the underscore
An introduction to scala
Scala or functional programming from a python developer's perspective
Scala in a Java 8 World
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala
Ad

More from Christian Baranowski (20)

PDF
Microservices – die Architektur für Agile-Entwicklung?
PDF
OSGi and Spring Data for simple (Web) Application Development
PDF
BDD - Behavior Driven Development Webapps mit Groovy Spock und Geb
PDF
Komponententests und Testabdeckung
PDF
Einführung in die Software-Qualitätssicherung
PDF
OSGi Web Development in Action
PDF
Spock and Geb in Action
PDF
Continuous Delivery in Action
PDF
Gradle and Continuous Delivery
PDF
Spock and Geb
PPTX
Semantic Versioning
PDF
OSGi Community Updates 2012
PDF
OSGi Mars World in Action
PDF
PDF
Top10- Software Engineering Books
PPT
Domain Driven Design - 10min
PDF
Einführung Vorgehensmodelle und Agile Software Entwicklung
PDF
Software Testing und Qualitätssicherung
PDF
Einführung Software Testing und Qualitätssicherung
PDF
Datenbankzugriff mit der Java Persistence Api
Microservices – die Architektur für Agile-Entwicklung?
OSGi and Spring Data for simple (Web) Application Development
BDD - Behavior Driven Development Webapps mit Groovy Spock und Geb
Komponententests und Testabdeckung
Einführung in die Software-Qualitätssicherung
OSGi Web Development in Action
Spock and Geb in Action
Continuous Delivery in Action
Gradle and Continuous Delivery
Spock and Geb
Semantic Versioning
OSGi Community Updates 2012
OSGi Mars World in Action
Top10- Software Engineering Books
Domain Driven Design - 10min
Einführung Vorgehensmodelle und Agile Software Entwicklung
Software Testing und Qualitätssicherung
Einführung Software Testing und Qualitätssicherung
Datenbankzugriff mit der Java Persistence Api

Recently uploaded (20)

PPTX
TEXTILE technology diploma scope and career opportunities
PPTX
Configure Apache Mutual Authentication
PDF
Flame analysis and combustion estimation using large language and vision assi...
PPTX
Custom Battery Pack Design Considerations for Performance and Safety
PDF
OpenACC and Open Hackathons Monthly Highlights July 2025
PDF
Architecture types and enterprise applications.pdf
PDF
NewMind AI Weekly Chronicles – August ’25 Week III
PDF
Accessing-Finance-in-Jordan-MENA 2024 2025.pdf
PPTX
AI IN MARKETING- PRESENTED BY ANWAR KABIR 1st June 2025.pptx
PPTX
GROUP4NURSINGINFORMATICSREPORT-2 PRESENTATION
PPT
Geologic Time for studying geology for geologist
PDF
“A New Era of 3D Sensing: Transforming Industries and Creating Opportunities,...
PDF
Produktkatalog für HOBO Datenlogger, Wetterstationen, Sensoren, Software und ...
PDF
The influence of sentiment analysis in enhancing early warning system model f...
DOCX
Basics of Cloud Computing - Cloud Ecosystem
PPTX
The various Industrial Revolutions .pptx
PDF
CloudStack 4.21: First Look Webinar slides
PDF
sbt 2.0: go big (Scala Days 2025 edition)
PDF
Comparative analysis of machine learning models for fake news detection in so...
PDF
Five Habits of High-Impact Board Members
TEXTILE technology diploma scope and career opportunities
Configure Apache Mutual Authentication
Flame analysis and combustion estimation using large language and vision assi...
Custom Battery Pack Design Considerations for Performance and Safety
OpenACC and Open Hackathons Monthly Highlights July 2025
Architecture types and enterprise applications.pdf
NewMind AI Weekly Chronicles – August ’25 Week III
Accessing-Finance-in-Jordan-MENA 2024 2025.pdf
AI IN MARKETING- PRESENTED BY ANWAR KABIR 1st June 2025.pptx
GROUP4NURSINGINFORMATICSREPORT-2 PRESENTATION
Geologic Time for studying geology for geologist
“A New Era of 3D Sensing: Transforming Industries and Creating Opportunities,...
Produktkatalog für HOBO Datenlogger, Wetterstationen, Sensoren, Software und ...
The influence of sentiment analysis in enhancing early warning system model f...
Basics of Cloud Computing - Cloud Ecosystem
The various Industrial Revolutions .pptx
CloudStack 4.21: First Look Webinar slides
sbt 2.0: go big (Scala Days 2025 edition)
Comparative analysis of machine learning models for fake news detection in so...
Five Habits of High-Impact Board Members

SDC - Einführung in Scala

  • 1. Einführung in Scala SDC 2011 - Seitenbau Konstanz Christian Baranowski Dennis Braunsdorf
  • 3. Scala a Scalable Language
  • 4. Scala Bazaar Scala = Bazaar Java = Cathedral “ The Cathedral and the Bazaar” - Eric S. Raymond
  • 9. Scala ist statisch typisiert
  • 11. Variablen var msg = &quot;Hello SDC!&quot; // Java Code String msg = &quot;Hello World&quot; ; val msg = &quot;Hello SDC!“ // Java Code final String msg = &quot;Hello World&quot; ;
  • 12. Funktionen def max(x : Int, y : Int) : Int = { if (x > y) { return x; } else { return y; } }
  • 13. Funktionen def max(x : Int, y : Int) : Int = { if (x > y) { x } else { y } }
  • 14. Funktionen def max(x : Int, y : Int) : Int = { if (x > y) x else y }
  • 15. Funktionen def max(x : Int, y : Int) = { if (x > y) x else y }
  • 16. Procedure def printer(msg : String) { ... }
  • 17. Funktionen Composition and Scoping def max(x : Int, y : Int) = { def xGreater() = { x > y } if (xGreater()) x else y }
  • 18. Funktionen Composition and Scoping def max(x : Int, y : Int) = { def xGreater() = { x > y } if (xGreater) x else y }
  • 19. Functions are objects def oncePerSecond(callback: () => Unit) { while ( true ) { callback(); Thread sleep 1000 } } def timeFlies() { println( &quot;time flies like an arrow...&quot; ) } oncePerSecond(timeFlies)
  • 20. Anonymous Functions def oncePerSecond(callback: () => Unit) { while ( true ) { callback(); Thread sleep 1000 } } oncePerSecond(() => println( &quot;time flies like an arrow...&quot; ))
  • 21. Arrays val names = new Array[String](2) names(0) = &quot;Dennis&quot; names(1) = &quot;Christian&quot;
  • 22. Arrays val names = Array( &quot;Dennis&quot; , &quot;Christian&quot; )
  • 23. Arrays val names = Array( &quot;Dennis&quot; , &quot;Christian&quot; , true , 0, 1.5) val names : Array[Any] = Array( &quot;Dennis&quot; , &quot;Christian&quot; , true , 0, 1.5)
  • 24. Listen val oneTwo = List(1, 2) val threeFour = List(3, 4) val oneTwoThreeFour = oneTwo ::: threeFour val oneTwoThree = 1 :: 2 :: 3 :: Nil
  • 25. Tuples val dennis = (1, &quot;Dennis&quot; ) val christian = (2, &quot;Christian&quot; ) val dennis = ( &quot;Dennis&quot; , &quot;Braunsdorf&quot; ) println(dennis._1) println(dennis._2)
  • 26. Sets
  • 27. Sets import scala.collection.mutable.HashSet val jetSet = new HashSet[String] jetSet += &quot;Lear&quot; jetSet += ( &quot;Boeing&quot; , &quot;Airbus&quot; ) println(jetSet.contains( &quot;Cessna&quot; ))
  • 28. Sets val jetSet = Set( &quot;AirBus&quot; ) jetSet: scala.collection.immutable.Set[java.lang.String]
  • 29. Maps
  • 30. Maps import scala.collection.mutable.HashMap val treasureMap = new HashMap[Int, String] treasureMap += 1 -> &quot;Go to island.&quot; treasureMap += 2 -> &quot;Find big X on ground.&quot; treasureMap += 3 -> &quot;Dig.&quot; println(treasureMap(2))
  • 31. Maps val treasureMap = Map( (1, &quot;Go to island.&quot; ), (2, &quot;Find big X on ground.&quot; ), (3, &quot;Dig.&quot; ) )
  • 32. While Schleife val names = Array( &quot;Dennis&quot; , &quot;Christian&quot; ) var i = 0 while (i < names.length) { println(names(i)) i = i + 1 }
  • 33. For Schleife val names = Array( &quot;Dennis&quot; , &quot;Christian&quot; ) for (name <- names) println(name)
  • 34. Foreach Collection val names = Array( &quot;Dennis&quot; , &quot;Christian&quot; ) names.foreach(name => println(name))
  • 35. Throw Exceptions def max(x : Int, y : Int) : Int = { if (x < 0) throw new Exception( &quot;Negativ Int!&quot; ) ... }
  • 36. Catch Exceptions try { ... } catch { case ioe: IOException => println( &quot;Fehler beim lesen auf dem Filesystem&quot; ) case e: Exception => println( &quot;Unbekannter Fehler&quot; ) }
  • 38. Everything is a Object
  • 39. Numbers are Objects 1 + 2 * 3 / x = (1).+(((2).*(3))./(x))
  • 40. Objekte object DemoService { def print(msg : String) { println(msg) } } DemoService.print( &quot;Hello World&quot; )
  • 41. Klassen class Complex(real: Double, imaginary: Double) { def re() = real def im() = imaginary }
  • 42. Klassen class Complex(real: Double, imaginary: Double) { def re = real def im = imaginary }
  • 43. Abstrakte Klassen abstract class Complex(real: Double, imaginary: Double) { abstract def re() def im = imaginary }
  • 44. Klassen protected class Complex(real: Double, imaginary: Double) { private def re() = real protected def im() = imaginary }
  • 45. Auxiliary Constructors class Complex(real: Double, imaginary: Double) { def this () = this (0,0) def re() = real def im() = imaginary }
  • 46. Packages und Imports package demo import javax._ import scala.collection.mutable.HashMap
  • 47. Scala Live Demo Getting Started ….
  • 49. Traits trait Ord { def < (that: Any): Boolean def <=(that: Any): Boolean = ( this < that) || ( this == that) def > (that: Any): Boolean = !( this <= that) def >=(that: Any): Boolean = !( this < that) } trait Service class MyOrd extends Ord with Service { def < (that: Any): Boolean = false }
  • 50. Operators + * - / class Demo { def + (x : Int) = 1 + x } var o1 = new MyOrd println(o1 + 1)
  • 51. Methoden Overloading class Demo { def + (x : Int) = 1 + x def + (x : Demo) = 1 + 1 }
  • 52. Methoden Überschreiben class Complex(real: Double, imaginary: Double) { def re = real def im = imaginary override def toString() = &quot;&quot; + re + ( if (im < 0) &quot;&quot; else &quot;+&quot; ) + im + &quot;i„ }
  • 53. Case Klassen abstract class Tree case class Sum(l: Tree, r: Tree) extends Tree case class Var(n: String) extends Tree case class Const(v: Int) extends Tree
  • 54. Pattern Matching def eval(t: Tree, env: Environment): Int = t match { case Sum(l, r) => eval(l, env) + eval(r, env) case Var(n) => env(n) case Const(v) => v } def derive(t: Tree, v: String): Tree = t match { case Sum(l, r) => Sum(derive(l, v), derive(r, v)) case Var(n) if (v == n) => Const(1) case _ => Const(0) } val exp: Tree = Sum(Sum(Var( &quot;x&quot; ),Var( &quot;x&quot; )),Sum(Const(7),Var( &quot;y&quot; ))) val env: Environment = { case &quot;x&quot; => 5 case &quot;y&quot; => 7 } println( &quot;Expression: &quot; + exp) println( &quot;Evaluation with x=5, y=7: &quot; + eval(exp, env)) println( &quot;Derivative relative to x:\n &quot; + derive(exp, &quot;x&quot; )) println( &quot;Derivative relative to y:\n &quot; + derive(exp, &quot;y&quot; ))
  • 56. For-Comprehensions for (p <- persons if p.age > 20) yield p.name def queens(n: Int): List[List[Int]] = { def placeQueens(k: Int): List[List[Int]] = if (k == 0) List(List()) else for { queens <- placeQueens(k - 1) column <- List.range(1, n + 1) if isSafe(column, queens, 1) } yield column :: queens placeQueens(n) } def isSafe(col: Int, queens: List[Int], delta: Int): Boolean for (b <- books; a <- b.authors if a startsWith &quot;Ullman&quot; ) yield b.title
  • 57. Genericity class Reference[T] { private var contents: T = _ def set(value: T) { contents = value } def get: T = contents } object IntegerReference { def main(args: Array[String]) { val cell = new Reference[Int] cell.set(13) println( &quot;Reference contains the half of &quot; + (cell.get * 2)) } }
  • 58. Generic Stack abstract class Stack[A] { def push(x: A): Stack[A] = new NonEmptyStack[A](x, this ) def isEmpty: Boolean def top: A def pop: Stack[A] } class EmptyStack[A] extends Stack[A] { def isEmpty = true def top = error( &quot;EmptyStack.top&quot; ) def pop = error( &quot;EmptyStack.pop&quot; ) } class NonEmptyStack[A](elem: A, rest: Stack[A]) extends Stack[A] { def isEmpty = false def top = elem def pop = rest }
  • 59. Lazy Values case class Employee(id: Int, name: String, managerId: Int) { lazy val manager: Employee = Db.get(managerId) lazy val team: List[Employee] = Db.team(id) }
  • 60. Implicit Parameters implicit object stringMonoid extends Monoid[String] { def add(x: String, y: String): String = x.concat(y) def unit: String = &quot;&quot; } implicit object intMonoid extends Monoid[Int] { def add(x: Int, y: Int): Int = x + y def unit: Int = 0 }
  • 61. Implicit Conversions implicit def int2ordered(x: Int): Ordered[Int] = new Ordered[Int] { def compare(y: Int): Int = if (x < y) -1 else if (x > y) 1 else 0 }
  • 62. Annotations @field class BeanProperty extends annotation.StaticAnnotation
  • 63. Scala Java Integration // Java public class MainJava { public static void main(String[] args) { Point point = new Point(); point.name(); } } // Scala class Point(x : Int, y : Int) { var name = &quot;Bin ein Point&quot; def this () = this (0, 0) override def toString = name + &quot; : x=&quot; + x + &quot; : y=&quot; + y }
  • 64. Package Objects package object demo { implicit def toPoint(name: String) = new Point }
  • 66. Java Beans mit Scala class PersonBean { @scala.reflect.BeanProperty var name : String = &quot;&quot; }
  • 67. JUnit Tests with Scala import org.junit._ import org.junit.Assert._; class MaxTest { var max : MathUtils = null ; @Before def setup(){ max = new MathUtils } @Test def max_fiveGreaterThenFour() { assertEquals(5, max.max(5, 4)); } }
  • 68. Scala als DSL Toolkit
  • 70. Robot DSL object DemoRobot extends RobotProgram with Application { 000 PRINT &quot;Lunar Mars Program starts.&quot; 001 MOVE(1, 10) 002 SLEEP2000 003 MOVE(10, 10) 004 PRINT &quot;POSITION Now 10, 10&quot; 005 MOVE(20, 20) 006 END RUN }
  • 73. References Scala – http://www.scala-lang.org/ Scala IDE - http://www.scala-ide.org/ Scala Code Snippets http://www.scala-lang.org/node/220 Scala By Example http://www.scala-lang.org/docu/files/ScalaByExample.pdf Scala Tutorial http://www.scala-lang.org/docu/files/ScalaTutorial.pdf Scala Actors - http://www.scala-lang.org/node/242 Lift http://liftweb.net