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

Viewers also liked

Catálogo de servicios para la administración pública
Catálogo de servicios para la administración públicaCatálogo de servicios para la administración pública
Catálogo de servicios para la administración pública
PROQUAME
 
Luis Roberto Rueda, El postergado debate sobre la tenencia de drogas para uso...
Luis Roberto Rueda, El postergado debate sobre la tenencia de drogas para uso...Luis Roberto Rueda, El postergado debate sobre la tenencia de drogas para uso...
Luis Roberto Rueda, El postergado debate sobre la tenencia de drogas para uso...
Juez Luis Rueda
 
Presentació coordinació tic II
Presentació coordinació tic IIPresentació coordinació tic II
Presentació coordinació tic IIimmavallse
 
abcTrader Bolsalia 2013
abcTrader Bolsalia 2013abcTrader Bolsalia 2013
abcTrader Bolsalia 2013
Jose Manuel Garcia Suarez
 
La meva selecció Fotofilosofia 2013
La meva selecció Fotofilosofia 2013La meva selecció Fotofilosofia 2013
La meva selecció Fotofilosofia 2013
jbeltran
 
LA County HIV Public Health Fellowship Program Application Form
LA County HIV Public Health Fellowship Program Application FormLA County HIV Public Health Fellowship Program Application Form
LA County HIV Public Health Fellowship Program Application Form
Eric Olander
 
Luis Garicano - Mesa redonda sobre Premio Nobel de Economía 2014
Luis Garicano - Mesa redonda sobre Premio Nobel de Economía 2014Luis Garicano - Mesa redonda sobre Premio Nobel de Economía 2014
Luis Garicano - Mesa redonda sobre Premio Nobel de Economía 2014
Fundación Ramón Areces
 
Cornualles
CornuallesCornualles
Cornualles
JimmyP
 
Riesgos y amenazas de la informacion.
Riesgos y amenazas de la informacion.Riesgos y amenazas de la informacion.
Riesgos y amenazas de la informacion.
Juan C Luna D
 
Presentation about the school 2012 13
Presentation about the school 2012 13Presentation about the school 2012 13
Presentation about the school 2012 13
Carmen Olmedo Rueda
 
Effizienz auf Knopfdruck
Effizienz auf KnopfdruckEffizienz auf Knopfdruck
Effizienz auf Knopfdruck
d.velop AG
 
Diada Nacional - 11 Setembre 1714/2014
Diada Nacional - 11 Setembre 1714/2014Diada Nacional - 11 Setembre 1714/2014
Diada Nacional - 11 Setembre 1714/2014
Miqui Mel
 
Chapter 5
Chapter 5Chapter 5
Chapter 5
kscheidy
 
Fundamentos sentencia 7530
Fundamentos sentencia 7530 Fundamentos sentencia 7530
Fundamentos sentencia 7530
Gabriel Conte
 
Doctrina social total
Doctrina social totalDoctrina social total
Doctrina social total
clasesteologia
 
Manuscrito discapacidad auditiva
Manuscrito discapacidad auditivaManuscrito discapacidad auditiva
Manuscrito discapacidad auditiva
brendaj2
 
Presentacion de derecho romano 15082015
Presentacion de derecho romano 15082015Presentacion de derecho romano 15082015
Presentacion de derecho romano 15082015
solodiossalva
 
Manguito rotador st naples 2009 (ph)
Manguito rotador  st naples 2009 (ph)Manguito rotador  st naples 2009 (ph)
Manguito rotador st naples 2009 (ph)
drnaula
 
SEO Attribution for Dummies - Webmarketing123 webinar slides
SEO Attribution for Dummies - Webmarketing123 webinar slidesSEO Attribution for Dummies - Webmarketing123 webinar slides
SEO Attribution for Dummies - Webmarketing123 webinar slides
DemandWave
 

Viewers also liked (20)

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

Similar to Introduction to Scala

Scala - Java2Days Sofia
Scala - Java2Days SofiaScala - Java2Days Sofia
Scala - Java2Days Sofia
Manuel Bernhardt
 
Workshop Scala
Workshop ScalaWorkshop Scala
Workshop Scala
Bert Van Vreckem
 
Intro to scala
Intro to scalaIntro to scala
Intro to scala
Joe Zulli
 
1.1 motivation
1.1 motivation1.1 motivation
1.1 motivation
wpgreenway
 
Scala introduction
Scala introductionScala introduction
Scala introduction
Mohan Rao Pusarla
 
Scala for Java Developers (Silicon Valley Code Camp 13)
Scala for Java Developers (Silicon Valley Code Camp 13)Scala for Java Developers (Silicon Valley Code Camp 13)
Scala for Java Developers (Silicon Valley Code Camp 13)
Ramnivas Laddad
 
Scala uma poderosa linguagem para a jvm
Scala   uma poderosa linguagem para a jvmScala   uma poderosa linguagem para a jvm
Scala uma poderosa linguagem para a jvm
Isaias Barroso
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
Lorenzo Dematté
 
Scala presentationjune112011
Scala presentationjune112011Scala presentationjune112011
Scala presentationjune112011
PrasannaKumar Sathyanarayanan
 
Scala
ScalaScala
Live coding scala 'the java of the future'
Live coding scala 'the java of the future'Live coding scala 'the java of the future'
Live coding scala 'the java of the future'
Xebia Nederland BV
 
An Introduction to Scala for Java Developers
An Introduction to Scala for Java DevelopersAn Introduction to Scala for Java Developers
An Introduction to Scala for Java Developers
Miles Sabin
 
BCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java DevelopersBCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java Developers
Miles Sabin
 
Scala overview
Scala overviewScala overview
Scala overview
Steve Min
 
1.1 motivation
1.1 motivation1.1 motivation
1.1 motivation
Ruud van Vliet
 
1.1 motivation
1.1 motivation1.1 motivation
1.1 motivation
Amir Mardani
 
Stepping Up : A Brief Intro to Scala
Stepping Up : A Brief Intro to ScalaStepping Up : A Brief Intro to Scala
Stepping Up : A Brief Intro to Scala
Derek Chen-Becker
 
Scala in a nutshell by venkat
Scala in a nutshell by venkatScala in a nutshell by venkat
Scala in a nutshell by venkat
Venkateswaran Kandasamy
 
Scala in Practice
Scala in PracticeScala in Practice
Scala in Practice
Francesco Usai
 
Quick introduction to scala
Quick introduction to scalaQuick introduction to scala
Quick introduction to scala
Mohammad Hossein Rimaz
 

Similar to Introduction to Scala (20)

Scala - Java2Days Sofia
Scala - Java2Days SofiaScala - Java2Days Sofia
Scala - Java2Days Sofia
 
Workshop Scala
Workshop ScalaWorkshop Scala
Workshop Scala
 
Intro to scala
Intro to scalaIntro to scala
Intro to scala
 
1.1 motivation
1.1 motivation1.1 motivation
1.1 motivation
 
Scala introduction
Scala introductionScala introduction
Scala introduction
 
Scala for Java Developers (Silicon Valley Code Camp 13)
Scala for Java Developers (Silicon Valley Code Camp 13)Scala for Java Developers (Silicon Valley Code Camp 13)
Scala for Java Developers (Silicon Valley Code Camp 13)
 
Scala uma poderosa linguagem para a jvm
Scala   uma poderosa linguagem para a jvmScala   uma poderosa linguagem para a jvm
Scala uma poderosa linguagem para a jvm
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
Scala presentationjune112011
Scala presentationjune112011Scala presentationjune112011
Scala presentationjune112011
 
Scala
ScalaScala
Scala
 
Live coding scala 'the java of the future'
Live coding scala 'the java of the future'Live coding scala 'the java of the future'
Live coding scala 'the java of the future'
 
An Introduction to Scala for Java Developers
An Introduction to Scala for Java DevelopersAn Introduction to Scala for Java Developers
An Introduction to Scala for Java Developers
 
BCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java DevelopersBCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java Developers
 
Scala overview
Scala overviewScala overview
Scala overview
 
1.1 motivation
1.1 motivation1.1 motivation
1.1 motivation
 
1.1 motivation
1.1 motivation1.1 motivation
1.1 motivation
 
Stepping Up : A Brief Intro to Scala
Stepping Up : A Brief Intro to ScalaStepping Up : A Brief Intro to Scala
Stepping Up : A Brief Intro to Scala
 
Scala in a nutshell by venkat
Scala in a nutshell by venkatScala in a nutshell by venkat
Scala in a nutshell by venkat
 
Scala in Practice
Scala in PracticeScala in Practice
Scala in Practice
 
Quick introduction to scala
Quick introduction to scalaQuick introduction to scala
Quick introduction to scala
 

More from Manuel Bernhardt

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

More from Manuel Bernhardt (18)

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

Recently uploaded

Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
Hiroshi SHIBATA
 
Ocean lotus Threat actors project by John Sitima 2024 (1).pptx
Ocean lotus Threat actors project by John Sitima 2024 (1).pptxOcean lotus Threat actors project by John Sitima 2024 (1).pptx
Ocean lotus Threat actors project by John Sitima 2024 (1).pptx
SitimaJohn
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
Jason Packer
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Safe Software
 
HCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAUHCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAU
panagenda
 
Deep Dive: Getting Funded with Jason Jason Lemkin Founder & CEO @ SaaStr
Deep Dive: Getting Funded with Jason Jason Lemkin Founder & CEO @ SaaStrDeep Dive: Getting Funded with Jason Jason Lemkin Founder & CEO @ SaaStr
Deep Dive: Getting Funded with Jason Jason Lemkin Founder & CEO @ SaaStr
saastr
 
WeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation TechniquesWeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation Techniques
Postman
 
AWS Cloud Cost Optimization Presentation.pptx
AWS Cloud Cost Optimization Presentation.pptxAWS Cloud Cost Optimization Presentation.pptx
AWS Cloud Cost Optimization Presentation.pptx
HarisZaheer8
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
Zilliz
 
Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...
Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...
Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...
Tatiana Kojar
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
Jakub Marek
 
System Design Case Study: Building a Scalable E-Commerce Platform - Hiike
System Design Case Study: Building a Scalable E-Commerce Platform - HiikeSystem Design Case Study: Building a Scalable E-Commerce Platform - Hiike
System Design Case Study: Building a Scalable E-Commerce Platform - Hiike
Hiike
 
GraphRAG for Life Science to increase LLM accuracy
GraphRAG for Life Science to increase LLM accuracyGraphRAG for Life Science to increase LLM accuracy
GraphRAG for Life Science to increase LLM accuracy
Tomaz Bratanic
 
A Comprehensive Guide to DeFi Development Services in 2024
A Comprehensive Guide to DeFi Development Services in 2024A Comprehensive Guide to DeFi Development Services in 2024
A Comprehensive Guide to DeFi Development Services in 2024
Intelisync
 
Azure API Management to expose backend services securely
Azure API Management to expose backend services securelyAzure API Management to expose backend services securely
Azure API Management to expose backend services securely
Dinusha Kumarasiri
 
Nordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptxNordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptx
MichaelKnudsen27
 
Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
Octavian Nadolu
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
DanBrown980551
 
Skybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoptionSkybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoption
Tatiana Kojar
 
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdfUnlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Malak Abu Hammad
 

Recently uploaded (20)

Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
 
Ocean lotus Threat actors project by John Sitima 2024 (1).pptx
Ocean lotus Threat actors project by John Sitima 2024 (1).pptxOcean lotus Threat actors project by John Sitima 2024 (1).pptx
Ocean lotus Threat actors project by John Sitima 2024 (1).pptx
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
 
HCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAUHCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAU
 
Deep Dive: Getting Funded with Jason Jason Lemkin Founder & CEO @ SaaStr
Deep Dive: Getting Funded with Jason Jason Lemkin Founder & CEO @ SaaStrDeep Dive: Getting Funded with Jason Jason Lemkin Founder & CEO @ SaaStr
Deep Dive: Getting Funded with Jason Jason Lemkin Founder & CEO @ SaaStr
 
WeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation TechniquesWeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation Techniques
 
AWS Cloud Cost Optimization Presentation.pptx
AWS Cloud Cost Optimization Presentation.pptxAWS Cloud Cost Optimization Presentation.pptx
AWS Cloud Cost Optimization Presentation.pptx
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
 
Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...
Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...
Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
 
System Design Case Study: Building a Scalable E-Commerce Platform - Hiike
System Design Case Study: Building a Scalable E-Commerce Platform - HiikeSystem Design Case Study: Building a Scalable E-Commerce Platform - Hiike
System Design Case Study: Building a Scalable E-Commerce Platform - Hiike
 
GraphRAG for Life Science to increase LLM accuracy
GraphRAG for Life Science to increase LLM accuracyGraphRAG for Life Science to increase LLM accuracy
GraphRAG for Life Science to increase LLM accuracy
 
A Comprehensive Guide to DeFi Development Services in 2024
A Comprehensive Guide to DeFi Development Services in 2024A Comprehensive Guide to DeFi Development Services in 2024
A Comprehensive Guide to DeFi Development Services in 2024
 
Azure API Management to expose backend services securely
Azure API Management to expose backend services securelyAzure API Management to expose backend services securely
Azure API Management to expose backend services securely
 
Nordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptxNordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptx
 
Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
 
Skybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoptionSkybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoption
 
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdfUnlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.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