SlideShare a Scribd company logo
SCALA
Java Klassentreffen 2013
Manuel Bernhardt
@elmanu Java Klassentreffen 2013 - javatraining.at
AGENDA
• History
• Why Scala?
• Scala in the wild
• The Code / Scala in practice
• Tools & more
@elmanu Java Klassentreffen 2013 - javatraining.at
YOUR SPEAKER
• Independent software
consultant
• Web, web, web
• Java & Scala & Javascript
• Open-Source
• Delving
@elmanu Java Klassentreffen 2013 - javatraining.at
AGENDA
• History
• Why Scala?
• Scala in the wild
• The Code / Scala in practice
• Tools & more
@elmanu Java Klassentreffen 2013 - javatraining.at
HISTORY
• Martin Odersky, EPFL
• Espresso, Pizza, GJ, Javac
• Funnel, Scala
• First Scala release in
2003
@elmanu Java Klassentreffen 2013 - javatraining.at
AGENDA
• History
• Why Scala?
• Scala in the wild
• The Code / Scala in practice
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA DESIGN GOALS
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA DESIGN GOALS
• Full interoperability with Java
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA DESIGN GOALS
• Full interoperability with Java
• Cut down boilerplate
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA DESIGN GOALS
• Full interoperability with Java
• Cut down boilerplate
• Pure object orientation & functional programming
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA DESIGN GOALS
• Full interoperability with Java
• Cut down boilerplate
• Pure object orientation & functional programming
• Move away from null
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA DESIGN GOALS
• Full interoperability with Java
• Cut down boilerplate
• Pure object orientation & functional programming
• Move away from null
• Multi-core programming
@elmanu Java Klassentreffen 2013 - javatraining.at
AGENDA
• History
• Why Scala?
• Scala in the wild
• The Code / Scala in practice
• Tools & more
@elmanu Java Klassentreffen 2013 - javatraining.at
WHAT PEOPLE SAY
If I were to pick a language today
other than Java, it would be Scala.
James Gosling
Father of Java
@elmanu Java Klassentreffen 2013 - javatraining.at
WHAT PEOPLE SAY
I can honestly say if someone had
shown me the Programming Scala
book by Martin Odersky, Lex Spoon
& Bill Venners back in 2003 I’d
probably have never created Groovy.
James Strachan
Creator of Groovy
@elmanu Java Klassentreffen 2013 - javatraining.at
ThoughtWorksTechRadar May 2013
http://www.thoughtworks.com/radar
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA INTHE WILD
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA INTHE WILD
etc.
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA INVIENNA
• openForce - http://openforce.com
• x-tradesoft - http://xtradesoft.com
• Delving - http://www.delving.eu
• dimocom - http://www.dimocom.com
• emarsys - http://www.emarsys.com
• Miavia - https://miavia.in
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA INVIENNA
• ScalaVienna User Group
• http://scala-vienna.org/
Next meeting: 26th
September 6 PM - Sektor 5
@elmanu Java Klassentreffen 2013 - javatraining.at
AGENDA
• History
• Why Scala?
• Scala in the wild
• The Code / Scala in
practice
• Tools & more
@elmanu Java Klassentreffen 2013 - javatraining.at
AVOIDINGTHE BILLION-
DOLLAR MISTAKE
But I couldn't resist the
temptation to put in a null
reference, simply because it
was so easy to implement
Tony Hoare
Creator of ALGOL
@elmanu Java Klassentreffen 2013 - javatraining.at
AVOIDINGTHE BILLION-
DOLLAR MISTAKE
val maybeUser: Option[User] = User.findOneByName("bob")
// returns Some[User]
maybeUser == None // false
maybeUser.foreach { user =>
println(user.fullName)
// prints "Bob Marley" if there is a user!
}
val name = maybeUser.map(_.name).getOrElse("Unknown user")
@elmanu Java Klassentreffen 2013 - javatraining.at
CONCISENESS
public class User {
! private String name;
! private String surname;
! private String email;
! public User(String name, String surname, String email) {
! ! this.name = name;
! ! this.surname = surname;
! ! this.email = email;
! }
! public void setName(String name) {
! ! this.name = name;
! }
! public void setSurname(String surname) {
! ! this.surname = surname;
! }
! public void setEmail(String email) {
! ! this.email = email
! }
! public String getName() {
! ! return this.name;
! }
! public String getSurname() {
! ! return this.surname;
! }
! public String getEmail() {
! ! return this.surname;
! }
}
@elmanu Java Klassentreffen 2013 - javatraining.at
CONCISENESS
class User(
var name: String,
var surname: String,
var email: String)
val bob = new User("Bob", "Marley", "bob@marley.org")
// bob: User = User@5c3f1224
bob.name // res0: String = Bob
bob.name = "Bobby" // bob.name: String = Bobby
@elmanu Java Klassentreffen 2013 - javatraining.at
CONCISENESS
public class ImmutableUser {
! private final String name;
! private final String surname;
! private final String email;
! public ImmutableUser(String name, String surname, String email) {
! ! this.name = name;
! ! this.surname = surname;
! ! this.email = email;
! }
! public String getName() {
! ! return this.name;
! }
! public String getSurname() {
! ! return this.surname;
! }
! public String getEmail() {
! ! return this.surname;
! }
! @Override public int hashCode() {
! ! // yada yada yada
! }
! @Override public boolean equals(Object that) {
! ! // yada yada yada
! }
}
@elmanu Java Klassentreffen 2013 - javatraining.at
CONCISENESS
case class ImmutableUser(
name: String,
surname: String,
email: String)
val bob = ImmutableUser("Bob", "Marley", "bob@marley.org")
// hashcode and equals for free!
val namedBob = ImmutableUser(name = "Bob", surname = "Marley",
email = "email")
val bobby = bob.copy(name = "Bobby")
// returns a User with name Bobby
bob.toString // res0: String = ImmutableUser(Bob,Marley,email)
@elmanu Java Klassentreffen 2013 - javatraining.at
USEFULTYPE INFERENCE
val foo = "Bar" // foo: String = Bar
val answer = 42 // answer: Int = 42
val price = 9.99 // price: Double = 9.99
val nums = List(1, 2, 3) // nums: List[Int] = List(1, 2, 3)
val map = Map("abc" -> List(1, 2, 3))
// map: scala.collection.immutable.Map[String,List[Int]] =
Map(abc -> List(1, 2, 3))
@elmanu Java Klassentreffen 2013 - javatraining.at
EXPLICITTYPING
val foo: String = "Bar" // foo: String = Bar
val answer: Int = 42 // answer: Int = 42
val price: Double = 9.99 // price: Double = 9.99
val nums: List[Int] = List(1, 2, 3) // nums: List[Int] =
List(1, 2, 3)
val map: Map[String, List[Int]] = Map("abc" -> List(1, 2, 3))
// map: scala.collection.immutable.Map[String,List[Int]] =
Map(abc -> List(1, 2, 3))
@elmanu Java Klassentreffen 2013 - javatraining.at
COLLECTION LIBRARY &
FUNCTIONAL STYLE
users.sort(new Comparator {
public int compare(Object user1, Object user2) {
! int userAge1 = ((User) user1).getAge();
! int userAge2 = ((User) user2).getAge();
! if (userAge1 > userAge2) {
! ! return 1;
! } else if userAge1 < userAge2) {
! ! ! return -1;
! ! } else {
! ! ! return 0;
! ! }
! }
});
@elmanu Java Klassentreffen 2013 - javatraining.at
COLLECTION LIBRARY &
FUNCTIONAL STYLE
def sortByAge(user1: User, user2: User) = user1.age > user2.age
users.sortWith(sortByAge)
@elmanu Java Klassentreffen 2013 - javatraining.at
COLLECTION LIBRARY &
FUNCTIONAL STYLE
users.sortWith((user1, user2) => user1.age > user2.age)
@elmanu Java Klassentreffen 2013 - javatraining.at
COLLECTION LIBRARY &
FUNCTIONAL STYLE
users.sortWith(_.age > _.age)
@elmanu Java Klassentreffen 2013 - javatraining.at
COLLECTION LIBRARY &
FUNCTIONAL STYLE
List<User> minors = new ArrayList<User>();
List<User> majors = new ArrayList<User>();
for (User u : users) {
! if (u.getAge() < 18) {
! ! minors.add(u);
! } else {
! ! majors.add(u);
! }
}
@elmanu Java Klassentreffen 2013 - javatraining.at
COLLECTION LIBRARY &
FUNCTIONAL STYLE
val (minors, majors) = users.partition(_.age < 18)
@elmanu Java Klassentreffen 2013 - javatraining.at
COLLECTION LIBRARY &
FUNCTIONAL STYLE
val minors = users.filter(_.age < 18)
@elmanu Java Klassentreffen 2013 - javatraining.at
• Minimal language, powerful library
• Language features for extensibility
EXTENSIBLE LANGUAGE
@elmanu Java Klassentreffen 2013 - javatraining.at
DOMAIN SPECIFIC
LANGUAGES
import collection.mutable.Stack
import org.scalatest._
class ExampleSpec extends FlatSpec with Matchers {
"A Stack" should "pop values in last-in-first-out order" in {
val stack = new Stack[Int]
stack.push(1)
stack.push(2)
stack.pop() should be (2)
stack.pop() should be (1)
}
it should "throw NoSuchElementException if an empty stack is popped" in {
val emptyStack = new Stack[Int]
a [NoSuchElementException] should be thrownBy {
emptyStack.pop()
}
}
}
@elmanu Java Klassentreffen 2013 - javatraining.at
MACROS
PLAY JSON DE/SERIALIZATION
@elmanu Java Klassentreffen 2013 - javatraining.at
MACROS
PLAY JSON DE/SERIALIZATION
case class Creature(name: String, isDead: Boolean, weight: Float)
implicit val creatureReads: Reads[Creature] = (
(__  "name").read[String] and
(__  "isDead").read[Boolean] and
(__  "weight").read[Float]
)(Creature)
implicit val creatureWrites: Writes[Creature] = (
(__  "name").write[String] and
(__  "isDead").write[Boolean] and
(__  "weight").write[Float]
)(unlift(Creature.unapply))
@elmanu Java Klassentreffen 2013 - javatraining.at
MACROS
PLAY JSON DE/SERIALIZATION
import play.api.json._
implicit val creatureFormat = Json.format[Creature] // format is a macro
@elmanu Java Klassentreffen 2013 - javatraining.at
AGENDA
• History
• Why Scala?
• Scala in the wild
• The Code / Scala in practice
• Tools & more
@elmanu Java Klassentreffen 2013 - javatraining.at
IDE
• IntelliJ IDEA
• Eclipse
• SublimeText
@elmanu Java Klassentreffen 2013 - javatraining.at
SIMPLE BUILDTOOL
name := "My Project"
version := "1.0"
organization := "org.myproject"
libraryDependencies += "org.scala-tools.testing" %% "scalacheck" %
"1.8" % "test"
libraryDependencies ++= Seq(
"net.databinder" %% "dispatch-meetup" % "0.7.8",
"net.databinder" %% "dispatch-twitter" % "0.7.8"
)
javaOptions += "-Xmx256m"
logLevel in compile := Level.Warn
@elmanu Java Klassentreffen 2013 - javatraining.at
FRAMEWORKS:AKKA
• Actor concurrency model based on Erlang
• “Human” design: actors talk to eachother and form hierarchies
• Much, much, much simpler to work and reason with than
threads
@elmanu Java Klassentreffen 2013 - javatraining.at
FRAMEWORKS:AKKA
Source: http://prabhubuzz.wordpress.com/2012/09/28/akka-really-mountains-of-concurrency/
@elmanu Java Klassentreffen 2013 - javatraining.at
FRAMEWORKS:AKKA
class Master extends Actor {
! val workers = context.actorOf(Props[Worker].withRouter(
! RoundRobinRouter(nrOfInstances = 5))
! )
! def receive = {
! ! case Start =>
! ! ! getDocumentsFromDb.foreach { document =>
! ! ! ! workers ! Process(document)
! ! ! }
! ! case Result(processed) => writeResult(processed)
! ! case Stop => children.foreach(stop)
! }
}
@elmanu Java Klassentreffen 2013 - javatraining.at
FRAMEWORKS:AKKA
class Worker extends Actor {
! def receive = {
! ! case Process(doc: Document) =>
! ! ! val processed = doSomeHardWork(doc)
! ! ! sender ! Result(processed)
! }
}
@elmanu Java Klassentreffen 2013 - javatraining.at
FRAMEWORKS: PLAY
• MVC framework à la Rails
• Real-time web, streams (WebSocket, ...)
• Everything is compiled
• I mean everything: CSS, JavaScripts,Templates, URLs, JSON, ...
@elmanu Java Klassentreffen 2013 - javatraining.at
FRAMEWORKS: PLAY
GET /users controllers.Users.list
POST /users controllers.Users.create
PUT /users/:id/update controllers.Users.update(id: Long)
DELETE /users/:id controllers.Users.delete(id: Long)
@elmanu Java Klassentreffen 2013 - javatraining.at
FRAMEWORKS: PLAY
class Users extends Controller {
def list = Action { request =>
val users = User.findAll
Ok(Json.toJson(users))
}
}
@elmanu Java Klassentreffen 2013 - javatraining.at
FRAMEWORKS: PLAY
class Users extends Controller {
def list = Action { request =>
val users = User.findAll
Ok(Json.toJson(users))
}
}
200 OK
Content-Type: application/json
@elmanu Java Klassentreffen 2013 - javatraining.at
THANKYOU!
• Questions, comments ?
• http://logician.eu
• manuel@bernhardt.io
• @elmanu

More Related Content

PDF
Why is Haskell so hard! (And how to deal with it?)
KEY
Scala Introduction
PDF
[Start] Scala
KEY
Scala For Java Programmers
PDF
Javawug bof 57 scala why now
PDF
Presentacion foro de análisis: a 4 años del mal gobierno del #PAN
PDF
Care2 Mobile Presentation - NetSquared DC January 28, 2014
PDF
Criminología vial
Why is Haskell so hard! (And how to deal with it?)
Scala Introduction
[Start] Scala
Scala For Java Programmers
Javawug bof 57 scala why now
Presentacion foro de análisis: a 4 años del mal gobierno del #PAN
Care2 Mobile Presentation - NetSquared DC January 28, 2014
Criminología vial

Viewers also liked (20)

PPT
Catálogo de servicios para la administración pública
PDF
Luis Roberto Rueda, El postergado debate sobre la tenencia de drogas para uso...
PDF
Presentació coordinació tic II
PPTX
abcTrader Bolsalia 2013
PPT
La meva selecció Fotofilosofia 2013
DOCX
LA County HIV Public Health Fellowship Program Application Form
PPT
Luis Garicano - Mesa redonda sobre Premio Nobel de Economía 2014
PPTX
Charles Robert Darwin
PPT
Cornualles
PPTX
Riesgos y amenazas de la informacion.
PPT
Presentation about the school 2012 13
PPTX
Effizienz auf Knopfdruck
PDF
Diada Nacional - 11 Setembre 1714/2014
PPT
Chapter 5
DOC
Fundamentos sentencia 7530
PPT
Doctrina social total
DOCX
Manuscrito discapacidad auditiva
PPTX
Presentacion de derecho romano 15082015
PPTX
Manguito rotador st naples 2009 (ph)
PDF
SEO Attribution for Dummies - Webmarketing123 webinar slides
Catálogo de servicios para la administración pública
Luis Roberto Rueda, El postergado debate sobre la tenencia de drogas para uso...
Presentació coordinació tic II
abcTrader Bolsalia 2013
La meva selecció Fotofilosofia 2013
LA County HIV Public Health Fellowship Program Application Form
Luis Garicano - Mesa redonda sobre Premio Nobel de Economía 2014
Charles Robert Darwin
Cornualles
Riesgos y amenazas de la informacion.
Presentation about the school 2012 13
Effizienz auf Knopfdruck
Diada Nacional - 11 Setembre 1714/2014
Chapter 5
Fundamentos sentencia 7530
Doctrina social total
Manuscrito discapacidad auditiva
Presentacion de derecho romano 15082015
Manguito rotador st naples 2009 (ph)
SEO Attribution for Dummies - Webmarketing123 webinar slides
Ad

Similar to Introduction to Scala (20)

PDF
Scala - Java2Days Sofia
PDF
Workshop Scala
PPTX
Intro to scala
ODP
1.1 motivation
PPTX
Scala introduction
PDF
Scala for Java Developers (Silicon Valley Code Camp 13)
PPT
Scala uma poderosa linguagem para a jvm
ODP
Introduction to Scala
PPT
Scala presentationjune112011
PPT
PDF
Live coding scala 'the java of the future'
PDF
BCS SPA 2010 - An Introduction to Scala for Java Developers
PDF
An Introduction to Scala for Java Developers
PDF
Scala overview
ODP
1.1 motivation
ODP
1.1 motivation
PDF
Stepping Up : A Brief Intro to Scala
PPT
Scala in a nutshell by venkat
PDF
Scala in Practice
PDF
Quick introduction to scala
Scala - Java2Days Sofia
Workshop Scala
Intro to scala
1.1 motivation
Scala introduction
Scala for Java Developers (Silicon Valley Code Camp 13)
Scala uma poderosa linguagem para a jvm
Introduction to Scala
Scala presentationjune112011
Live coding scala 'the java of the future'
BCS SPA 2010 - An Introduction to Scala for Java Developers
An Introduction to Scala for Java Developers
Scala overview
1.1 motivation
1.1 motivation
Stepping Up : A Brief Intro to Scala
Scala in a nutshell by venkat
Scala in Practice
Quick introduction to scala
Ad

More from Manuel Bernhardt (18)

PDF
Is there anybody out there? Reactive Systems Hamburg
PDF
Is there anybody out there? Scala Days Berlin 2018
PDF
Is there anybody out there?
PDF
Is there anybody out there?
PDF
8 akka anti-patterns you'd better be aware of - Reactive Summit Austin 2017
PDF
Scala Days Copenhagen - 8 Akka anti-patterns you'd better be aware of
PDF
8 Akka anti-patterns you'd better be aware of
PDF
Beyond the buzzword: a reactive web-appliction in practice
PDF
Beyond the Buzzword - a reactive application in practice
PDF
Six years of Scala and counting
PDF
3 things you must know to think reactive - Geecon Kraków 2015
PDF
Reactive Web-Applications @ LambdaDays
PDF
Writing a technical book
PDF
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
PDF
Back to the futures, actors and pipes: using Akka for large-scale data migration
PDF
Project Phoenix - From PHP to the Play Framework in 3 months
PDF
Tips and tricks for setting up a Play 2 project
PDF
Scala pitfalls
Is there anybody out there? Reactive Systems Hamburg
Is there anybody out there? Scala Days Berlin 2018
Is there anybody out there?
Is there anybody out there?
8 akka anti-patterns you'd better be aware of - Reactive Summit Austin 2017
Scala Days Copenhagen - 8 Akka anti-patterns you'd better be aware of
8 Akka anti-patterns you'd better be aware of
Beyond the buzzword: a reactive web-appliction in practice
Beyond the Buzzword - a reactive application in practice
Six years of Scala and counting
3 things you must know to think reactive - Geecon Kraków 2015
Reactive Web-Applications @ LambdaDays
Writing a technical book
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
Back to the futures, actors and pipes: using Akka for large-scale data migration
Project Phoenix - From PHP to the Play Framework in 3 months
Tips and tricks for setting up a Play 2 project
Scala pitfalls

Recently uploaded (20)

PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
cuic standard and advanced reporting.pdf
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Approach and Philosophy of On baking technology
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PPTX
Cloud computing and distributed systems.
PDF
Unlocking AI with Model Context Protocol (MCP)
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Machine learning based COVID-19 study performance prediction
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Electronic commerce courselecture one. Pdf
PPT
Teaching material agriculture food technology
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
cuic standard and advanced reporting.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Approach and Philosophy of On baking technology
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Cloud computing and distributed systems.
Unlocking AI with Model Context Protocol (MCP)
The AUB Centre for AI in Media Proposal.docx
Machine learning based COVID-19 study performance prediction
“AI and Expert System Decision Support & Business Intelligence Systems”
Advanced methodologies resolving dimensionality complications for autism neur...
Electronic commerce courselecture one. Pdf
Teaching material agriculture food technology
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Chapter 3 Spatial Domain Image Processing.pdf

Introduction to Scala

  • 2. @elmanu Java Klassentreffen 2013 - javatraining.at AGENDA • History • Why Scala? • Scala in the wild • The Code / Scala in practice • Tools & more
  • 3. @elmanu Java Klassentreffen 2013 - javatraining.at YOUR SPEAKER • Independent software consultant • Web, web, web • Java & Scala & Javascript • Open-Source • Delving
  • 4. @elmanu Java Klassentreffen 2013 - javatraining.at AGENDA • History • Why Scala? • Scala in the wild • The Code / Scala in practice • Tools & more
  • 5. @elmanu Java Klassentreffen 2013 - javatraining.at HISTORY • Martin Odersky, EPFL • Espresso, Pizza, GJ, Javac • Funnel, Scala • First Scala release in 2003
  • 6. @elmanu Java Klassentreffen 2013 - javatraining.at AGENDA • History • Why Scala? • Scala in the wild • The Code / Scala in practice
  • 7. @elmanu Java Klassentreffen 2013 - javatraining.at SCALA DESIGN GOALS
  • 8. @elmanu Java Klassentreffen 2013 - javatraining.at SCALA DESIGN GOALS • Full interoperability with Java
  • 9. @elmanu Java Klassentreffen 2013 - javatraining.at SCALA DESIGN GOALS • Full interoperability with Java • Cut down boilerplate
  • 10. @elmanu Java Klassentreffen 2013 - javatraining.at SCALA DESIGN GOALS • Full interoperability with Java • Cut down boilerplate • Pure object orientation & functional programming
  • 11. @elmanu Java Klassentreffen 2013 - javatraining.at SCALA DESIGN GOALS • Full interoperability with Java • Cut down boilerplate • Pure object orientation & functional programming • Move away from null
  • 12. @elmanu Java Klassentreffen 2013 - javatraining.at SCALA DESIGN GOALS • Full interoperability with Java • Cut down boilerplate • Pure object orientation & functional programming • Move away from null • Multi-core programming
  • 13. @elmanu Java Klassentreffen 2013 - javatraining.at AGENDA • History • Why Scala? • Scala in the wild • The Code / Scala in practice • Tools & more
  • 14. @elmanu Java Klassentreffen 2013 - javatraining.at WHAT PEOPLE SAY If I were to pick a language today other than Java, it would be Scala. James Gosling Father of Java
  • 15. @elmanu Java Klassentreffen 2013 - javatraining.at WHAT PEOPLE SAY I can honestly say if someone had shown me the Programming Scala book by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I’d probably have never created Groovy. James Strachan Creator of Groovy
  • 16. @elmanu Java Klassentreffen 2013 - javatraining.at ThoughtWorksTechRadar May 2013 http://www.thoughtworks.com/radar
  • 17. @elmanu Java Klassentreffen 2013 - javatraining.at SCALA INTHE WILD
  • 18. @elmanu Java Klassentreffen 2013 - javatraining.at SCALA INTHE WILD etc.
  • 19. @elmanu Java Klassentreffen 2013 - javatraining.at SCALA INVIENNA • openForce - http://openforce.com • x-tradesoft - http://xtradesoft.com • Delving - http://www.delving.eu • dimocom - http://www.dimocom.com • emarsys - http://www.emarsys.com • Miavia - https://miavia.in
  • 20. @elmanu Java Klassentreffen 2013 - javatraining.at SCALA INVIENNA • ScalaVienna User Group • http://scala-vienna.org/ Next meeting: 26th September 6 PM - Sektor 5
  • 21. @elmanu Java Klassentreffen 2013 - javatraining.at AGENDA • History • Why Scala? • Scala in the wild • The Code / Scala in practice • Tools & more
  • 22. @elmanu Java Klassentreffen 2013 - javatraining.at AVOIDINGTHE BILLION- DOLLAR MISTAKE But I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement Tony Hoare Creator of ALGOL
  • 23. @elmanu Java Klassentreffen 2013 - javatraining.at AVOIDINGTHE BILLION- DOLLAR MISTAKE val maybeUser: Option[User] = User.findOneByName("bob") // returns Some[User] maybeUser == None // false maybeUser.foreach { user => println(user.fullName) // prints "Bob Marley" if there is a user! } val name = maybeUser.map(_.name).getOrElse("Unknown user")
  • 24. @elmanu Java Klassentreffen 2013 - javatraining.at CONCISENESS public class User { ! private String name; ! private String surname; ! private String email; ! public User(String name, String surname, String email) { ! ! this.name = name; ! ! this.surname = surname; ! ! this.email = email; ! } ! public void setName(String name) { ! ! this.name = name; ! } ! public void setSurname(String surname) { ! ! this.surname = surname; ! } ! public void setEmail(String email) { ! ! this.email = email ! } ! public String getName() { ! ! return this.name; ! } ! public String getSurname() { ! ! return this.surname; ! } ! public String getEmail() { ! ! return this.surname; ! } }
  • 25. @elmanu Java Klassentreffen 2013 - javatraining.at CONCISENESS class User( var name: String, var surname: String, var email: String) val bob = new User("Bob", "Marley", "bob@marley.org") // bob: User = User@5c3f1224 bob.name // res0: String = Bob bob.name = "Bobby" // bob.name: String = Bobby
  • 26. @elmanu Java Klassentreffen 2013 - javatraining.at CONCISENESS public class ImmutableUser { ! private final String name; ! private final String surname; ! private final String email; ! public ImmutableUser(String name, String surname, String email) { ! ! this.name = name; ! ! this.surname = surname; ! ! this.email = email; ! } ! public String getName() { ! ! return this.name; ! } ! public String getSurname() { ! ! return this.surname; ! } ! public String getEmail() { ! ! return this.surname; ! } ! @Override public int hashCode() { ! ! // yada yada yada ! } ! @Override public boolean equals(Object that) { ! ! // yada yada yada ! } }
  • 27. @elmanu Java Klassentreffen 2013 - javatraining.at CONCISENESS case class ImmutableUser( name: String, surname: String, email: String) val bob = ImmutableUser("Bob", "Marley", "bob@marley.org") // hashcode and equals for free! val namedBob = ImmutableUser(name = "Bob", surname = "Marley", email = "email") val bobby = bob.copy(name = "Bobby") // returns a User with name Bobby bob.toString // res0: String = ImmutableUser(Bob,Marley,email)
  • 28. @elmanu Java Klassentreffen 2013 - javatraining.at USEFULTYPE INFERENCE val foo = "Bar" // foo: String = Bar val answer = 42 // answer: Int = 42 val price = 9.99 // price: Double = 9.99 val nums = List(1, 2, 3) // nums: List[Int] = List(1, 2, 3) val map = Map("abc" -> List(1, 2, 3)) // map: scala.collection.immutable.Map[String,List[Int]] = Map(abc -> List(1, 2, 3))
  • 29. @elmanu Java Klassentreffen 2013 - javatraining.at EXPLICITTYPING val foo: String = "Bar" // foo: String = Bar val answer: Int = 42 // answer: Int = 42 val price: Double = 9.99 // price: Double = 9.99 val nums: List[Int] = List(1, 2, 3) // nums: List[Int] = List(1, 2, 3) val map: Map[String, List[Int]] = Map("abc" -> List(1, 2, 3)) // map: scala.collection.immutable.Map[String,List[Int]] = Map(abc -> List(1, 2, 3))
  • 30. @elmanu Java Klassentreffen 2013 - javatraining.at COLLECTION LIBRARY & FUNCTIONAL STYLE users.sort(new Comparator { public int compare(Object user1, Object user2) { ! int userAge1 = ((User) user1).getAge(); ! int userAge2 = ((User) user2).getAge(); ! if (userAge1 > userAge2) { ! ! return 1; ! } else if userAge1 < userAge2) { ! ! ! return -1; ! ! } else { ! ! ! return 0; ! ! } ! } });
  • 31. @elmanu Java Klassentreffen 2013 - javatraining.at COLLECTION LIBRARY & FUNCTIONAL STYLE def sortByAge(user1: User, user2: User) = user1.age > user2.age users.sortWith(sortByAge)
  • 32. @elmanu Java Klassentreffen 2013 - javatraining.at COLLECTION LIBRARY & FUNCTIONAL STYLE users.sortWith((user1, user2) => user1.age > user2.age)
  • 33. @elmanu Java Klassentreffen 2013 - javatraining.at COLLECTION LIBRARY & FUNCTIONAL STYLE users.sortWith(_.age > _.age)
  • 34. @elmanu Java Klassentreffen 2013 - javatraining.at COLLECTION LIBRARY & FUNCTIONAL STYLE List<User> minors = new ArrayList<User>(); List<User> majors = new ArrayList<User>(); for (User u : users) { ! if (u.getAge() < 18) { ! ! minors.add(u); ! } else { ! ! majors.add(u); ! } }
  • 35. @elmanu Java Klassentreffen 2013 - javatraining.at COLLECTION LIBRARY & FUNCTIONAL STYLE val (minors, majors) = users.partition(_.age < 18)
  • 36. @elmanu Java Klassentreffen 2013 - javatraining.at COLLECTION LIBRARY & FUNCTIONAL STYLE val minors = users.filter(_.age < 18)
  • 37. @elmanu Java Klassentreffen 2013 - javatraining.at • Minimal language, powerful library • Language features for extensibility EXTENSIBLE LANGUAGE
  • 38. @elmanu Java Klassentreffen 2013 - javatraining.at DOMAIN SPECIFIC LANGUAGES import collection.mutable.Stack import org.scalatest._ class ExampleSpec extends FlatSpec with Matchers { "A Stack" should "pop values in last-in-first-out order" in { val stack = new Stack[Int] stack.push(1) stack.push(2) stack.pop() should be (2) stack.pop() should be (1) } it should "throw NoSuchElementException if an empty stack is popped" in { val emptyStack = new Stack[Int] a [NoSuchElementException] should be thrownBy { emptyStack.pop() } } }
  • 39. @elmanu Java Klassentreffen 2013 - javatraining.at MACROS PLAY JSON DE/SERIALIZATION
  • 40. @elmanu Java Klassentreffen 2013 - javatraining.at MACROS PLAY JSON DE/SERIALIZATION case class Creature(name: String, isDead: Boolean, weight: Float) implicit val creatureReads: Reads[Creature] = ( (__ "name").read[String] and (__ "isDead").read[Boolean] and (__ "weight").read[Float] )(Creature) implicit val creatureWrites: Writes[Creature] = ( (__ "name").write[String] and (__ "isDead").write[Boolean] and (__ "weight").write[Float] )(unlift(Creature.unapply))
  • 41. @elmanu Java Klassentreffen 2013 - javatraining.at MACROS PLAY JSON DE/SERIALIZATION import play.api.json._ implicit val creatureFormat = Json.format[Creature] // format is a macro
  • 42. @elmanu Java Klassentreffen 2013 - javatraining.at AGENDA • History • Why Scala? • Scala in the wild • The Code / Scala in practice • Tools & more
  • 43. @elmanu Java Klassentreffen 2013 - javatraining.at IDE • IntelliJ IDEA • Eclipse • SublimeText
  • 44. @elmanu Java Klassentreffen 2013 - javatraining.at SIMPLE BUILDTOOL name := "My Project" version := "1.0" organization := "org.myproject" libraryDependencies += "org.scala-tools.testing" %% "scalacheck" % "1.8" % "test" libraryDependencies ++= Seq( "net.databinder" %% "dispatch-meetup" % "0.7.8", "net.databinder" %% "dispatch-twitter" % "0.7.8" ) javaOptions += "-Xmx256m" logLevel in compile := Level.Warn
  • 45. @elmanu Java Klassentreffen 2013 - javatraining.at FRAMEWORKS:AKKA • Actor concurrency model based on Erlang • “Human” design: actors talk to eachother and form hierarchies • Much, much, much simpler to work and reason with than threads
  • 46. @elmanu Java Klassentreffen 2013 - javatraining.at FRAMEWORKS:AKKA Source: http://prabhubuzz.wordpress.com/2012/09/28/akka-really-mountains-of-concurrency/
  • 47. @elmanu Java Klassentreffen 2013 - javatraining.at FRAMEWORKS:AKKA class Master extends Actor { ! val workers = context.actorOf(Props[Worker].withRouter( ! RoundRobinRouter(nrOfInstances = 5)) ! ) ! def receive = { ! ! case Start => ! ! ! getDocumentsFromDb.foreach { document => ! ! ! ! workers ! Process(document) ! ! ! } ! ! case Result(processed) => writeResult(processed) ! ! case Stop => children.foreach(stop) ! } }
  • 48. @elmanu Java Klassentreffen 2013 - javatraining.at FRAMEWORKS:AKKA class Worker extends Actor { ! def receive = { ! ! case Process(doc: Document) => ! ! ! val processed = doSomeHardWork(doc) ! ! ! sender ! Result(processed) ! } }
  • 49. @elmanu Java Klassentreffen 2013 - javatraining.at FRAMEWORKS: PLAY • MVC framework à la Rails • Real-time web, streams (WebSocket, ...) • Everything is compiled • I mean everything: CSS, JavaScripts,Templates, URLs, JSON, ...
  • 50. @elmanu Java Klassentreffen 2013 - javatraining.at FRAMEWORKS: PLAY GET /users controllers.Users.list POST /users controllers.Users.create PUT /users/:id/update controllers.Users.update(id: Long) DELETE /users/:id controllers.Users.delete(id: Long)
  • 51. @elmanu Java Klassentreffen 2013 - javatraining.at FRAMEWORKS: PLAY class Users extends Controller { def list = Action { request => val users = User.findAll Ok(Json.toJson(users)) } }
  • 52. @elmanu Java Klassentreffen 2013 - javatraining.at FRAMEWORKS: PLAY class Users extends Controller { def list = Action { request => val users = User.findAll Ok(Json.toJson(users)) } } 200 OK Content-Type: application/json
  • 53. @elmanu Java Klassentreffen 2013 - javatraining.at THANKYOU! • Questions, comments ? • http://logician.eu • manuel@bernhardt.io • @elmanu