SCALA
Java2Days 2013
Manuel Bernhardt

Dienstag, 03. Dezember 13
AGENDA
• History
• Why

Scala?

• Scala

in the wild

• The

Code / Scala in
practice

• Tools
@elmanu
Dienstag, 03. Dezem...
YOUR SPEAKER
• Independent

software
consultant based in Vienna

• Web, web, web
• Scala

& Java & Javascript

• Open-Sour...
AGENDA
• History
• Why

Scala?

• Scala

in the wild

• The

Code / Scala in
practice

• Tools
@elmanu
Dienstag, 03. Dezem...
HISTORY
• Martin

Odersky, EPFL

• Espresso, Pizza, GJ,

javac

• Funnel, Scala
• First

Scala release in
2003

@elmanu
Di...
AGENDA
• History
• Why
• Scala
• The

Scala?

in the wild

Code / Scala in
practice

@elmanu
Dienstag, 03. Dezember 13
SCALA DESIGN GOALS

@elmanu
Dienstag, 03. Dezember 13
SCALA DESIGN GOALS
• Full

interoperability with Java

@elmanu
Dienstag, 03. Dezember 13
SCALA DESIGN GOALS
• Full

interoperability with Java

• Cut

down boilerplate

@elmanu
Dienstag, 03. Dezember 13
SCALA DESIGN GOALS
• Full

interoperability with Java

• Cut

down boilerplate

• Pure

@elmanu
Dienstag, 03. Dezember 13
...
SCALA DESIGN GOALS
• Full

interoperability with Java

• Cut

down boilerplate

• Pure

object orientation & functional pr...
SCALA DESIGN GOALS
• Full

interoperability with Java

• Cut

down boilerplate

• Pure

object orientation & functional pr...
AGENDA
• History
• Why

Scala?

• Scala

in the wild

• The

Code / Scala in
practice

• Tools
@elmanu
Dienstag, 03. Dezem...
WHAT PEOPLE SAY
If I were to pick a language today
other than Java, it would be Scala.
James Gosling
Father of Java

@elma...
WHAT PEOPLE SAY
I can honestly say if someone had
shown me the Programming Scala
book by Martin Odersky, Lex Spoon
& Bill ...
@elmanu
Dienstag, 03. Dezember 13

ThoughtWorks TechRadar May 2013
http://www.thoughtworks.com/radar
@elmanu
Dienstag, 03. Dezember 13

ThoughtWorks TechRadar May 2013
http://www.thoughtworks.com/radar
SCALA IN THE WILD

etc.
@elmanu
Dienstag, 03. Dezember 13
SCALA IN THE WILD

@elmanu
Dienstag, 03. Dezember 13
SCALA IN THE WORLD

http://www.scala-tribes.org/
@elmanu
Dienstag, 03. Dezember 13
SCALA IN VIENNA
• Scala Vienna
•1

User Group

year old, 124+ members

• http://scala-vienna.org/

@elmanu
Dienstag, 03. D...
AGENDA
• History
• Why

Scala?

• Scala

in the wild

• The

Code / Scala in
practice

• Tools
@elmanu
Dienstag, 03. Dezem...
AVOIDING THE BILLIONDOLLAR MISTAKE
But I couldn't resist the
temptation to put in a null
reference, simply because it
was ...
AVOIDING THE BILLIONDOLLAR MISTAKE
val maybeUser: Option[User] = User.findOneByName("bob")
// returns Some[User]
maybeUser...
CONCISENESS
public class User {
!

private String name;

!

private String surname;

!

private String email;

!
!
!
!
!

...
CONCISENESS
class
var
var
var

User(
name: String,
surname: String,
email: String)

val bob = new User("Bob", "Marley", "b...
CONCISENESS
public class ImmutableUser {
!

private final String name;

!

private final String surname;

!

private final...
CONCISENESS
case class ImmutableUser(
name: String,
surname: String,
email: String)

val bob = ImmutableUser("Bob", "Marle...
USEFUL TYPE INFERENCE

@elmanu
Dienstag, 03. Dezember 13
USEFUL TYPE INFERENCE
val foo = "Bar" // foo: String = Bar
val answer = 42 // answer: Int = 42
val price = 9.99 // price: ...
EXPLICIT TYPING
val foo: String = "Bar" // foo: String = Bar
val answer: Int = 42 // answer: Int = 42
val price: Double = ...
COLLECTION LIBRARY &
FUNCTIONAL STYLE
users.sort(new Comparator {
public int compare(Object user1, Object user2) {
! int u...
COLLECTION LIBRARY &
FUNCTIONAL STYLE
def sortByAge(user1: User, user2: User) = user1.age > user2.age
users.sortWith(sortB...
COLLECTION LIBRARY &
FUNCTIONAL STYLE
users.sortWith((user1, user2) => user1.age > user2.age)

@elmanu
Dienstag, 03. Dezem...
COLLECTION LIBRARY &
FUNCTIONAL STYLE
users.sortWith(_.age > _.age)

@elmanu
Dienstag, 03. Dezember 13
COLLECTION LIBRARY &
FUNCTIONAL STYLE
List<User> minors = new ArrayList<User>();
List<User> majors = new ArrayList<User>()...
COLLECTION LIBRARY &
FUNCTIONAL STYLE
val (minors, majors) = users.partition(_.age < 18)

@elmanu
Dienstag, 03. Dezember 1...
COLLECTION LIBRARY &
FUNCTIONAL STYLE
val minors = users.filter(_.age < 18)

@elmanu
Dienstag, 03. Dezember 13
EXTENSIBLE LANGUAGE

• Minimal

language, powerful library

• Language

@elmanu
Dienstag, 03. Dezember 13

features for ex...
DOMAIN SPECIFIC LANGUAGES
import collection.mutable.Stack
import org.scalatest._
class ExampleSpec extends FlatSpec with M...
DOMAIN SPECIFIC LANGUAGES
import collection.mutable.Stack
import org.scalatest._
class ExampleSpec extends FlatSpec with M...
MACROS

• Compile-time, during
• Expanding

type checking

the AST

• Experimental

since Scala 2.10

http://scalamacros.o...
MACROS
PLAY JSON DE/SERIALIZATION

@elmanu
Dienstag, 03. Dezember 13
MACROS
PLAY JSON DE/SERIALIZATION
case class Creature(name: String, isDead: Boolean, weight: Float)
implicit val creatureR...
MACROS
PLAY JSON DE/SERIALIZATION

import play.api.json._
implicit val creatureFormat = Json.format[Creature] // format is...
AGENDA
• History
• Why

Scala?

• Scala

in the wild

• The

Code / Scala in
practice

• Tools
@elmanu
Dienstag, 03. Dezem...
IDE

• IntelliJ

IDEA

• Eclipse
• SublimeText

@elmanu
Dienstag, 03. Dezember 13
SIMPLE BUILD TOOL
name := "My Project"
version := "1.0"
organization := "org.myproject"
libraryDependencies += "org.scala-...
PLAY! FRAMEWORK
• MVC

web framework,
inspired by RoR and Django

• Java, Scala
• Everything

is compiled

& scalable
perf...
PLAY! FRAMEWORK
• MVC

web framework,
inspired by RoR and Django

• Java, Scala
• Everything

is compiled

& scalable
perf...
AKKA
• Toolkit

for building
concurrent & distributed
applications more easily

• Actors

as concurrency
model, simpler to...
REACTIVE

http://www.reactivemanifesto.org

Dienstag, 03. Dezember 13
THANK YOU!

Questions, comments ?
http://manuel.bernhardt.io
manuel@bernhardt.io
@elmanu

@elmanu
Dienstag, 03. Dezember 1...
FRAMEWORKS: AKKA
• Actor

concurrency model based on Erlang

• “Human” design: actors

hierarchies

• Much, much, much

th...
FRAMEWORKS: AKKA

Source: http://prabhubuzz.wordpress.com/2012/09/28/akka-really-mountains-of-concurrency/

@elmanu
Dienst...
FRAMEWORKS: AKKA
class Master extends Actor {
!

val workers = context.actorOf(Props[Worker].withRouter(
! RoundRobinRoute...
FRAMEWORKS: AKKA
class Worker extends Actor {
! def receive = {
!
!
!
!
}

@elmanu
Dienstag, 03. Dezember 13

! case Proce...
FRAMEWORKS: PLAY

• MVC

framework à la Rails

• Everything
•I

is compiled

mean everything: CSS, JavaScripts, Templates,...
FRAMEWORKS: PLAY
GET
POST
PUT
DELETE

@elmanu
Dienstag, 03. Dezember 13

/users
/users
/users/:id/update
/users/:id

contr...
FRAMEWORKS: PLAY
class Users extends Controller {
def list = Action { request =>
val users = User.findAll
Ok(Json.toJson(u...
FRAMEWORKS: PLAY
class Users extends Controller {
def list = Action { request =>
val users = User.findAll
Ok(Json.toJson(u...
Upcoming SlideShare
Loading in …5
×

Scala - Java2Days Sofia

2,680 views

Published on

This is a short introduction to the Scala programming language and its ecosystem, giving some background about how the language came to be and a quick taste of what it looks like. It also shortly introduces a few tools and technologies related to it

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,680
On SlideShare
0
From Embeds
0
Number of Embeds
1,069
Actions
Shares
0
Downloads
19
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Scala - Java2Days Sofia

  1. 1. SCALA Java2Days 2013 Manuel Bernhardt Dienstag, 03. Dezember 13
  2. 2. AGENDA • History • Why Scala? • Scala in the wild • The Code / Scala in practice • Tools @elmanu Dienstag, 03. Dezember 13 & more
  3. 3. YOUR SPEAKER • Independent software consultant based in Vienna • Web, web, web • Scala & Java & Javascript • Open-Source @elmanu Dienstag, 03. Dezember 13
  4. 4. AGENDA • History • Why Scala? • Scala in the wild • The Code / Scala in practice • Tools @elmanu Dienstag, 03. Dezember 13 & more
  5. 5. HISTORY • Martin Odersky, EPFL • Espresso, Pizza, GJ, javac • Funnel, Scala • First Scala release in 2003 @elmanu Dienstag, 03. Dezember 13
  6. 6. AGENDA • History • Why • Scala • The Scala? in the wild Code / Scala in practice @elmanu Dienstag, 03. Dezember 13
  7. 7. SCALA DESIGN GOALS @elmanu Dienstag, 03. Dezember 13
  8. 8. SCALA DESIGN GOALS • Full interoperability with Java @elmanu Dienstag, 03. Dezember 13
  9. 9. SCALA DESIGN GOALS • Full interoperability with Java • Cut down boilerplate @elmanu Dienstag, 03. Dezember 13
  10. 10. SCALA DESIGN GOALS • Full interoperability with Java • Cut down boilerplate • Pure @elmanu Dienstag, 03. Dezember 13 object orientation & functional programming
  11. 11. SCALA DESIGN GOALS • Full interoperability with Java • Cut down boilerplate • Pure object orientation & functional programming • Move @elmanu Dienstag, 03. Dezember 13 away from null
  12. 12. SCALA DESIGN GOALS • Full interoperability with Java • Cut down boilerplate • Pure object orientation & functional programming • Move away from null • Multi-core @elmanu Dienstag, 03. Dezember 13 programming
  13. 13. AGENDA • History • Why Scala? • Scala in the wild • The Code / Scala in practice • Tools @elmanu Dienstag, 03. Dezember 13 & more
  14. 14. WHAT PEOPLE SAY If I were to pick a language today other than Java, it would be Scala. James Gosling Father of Java @elmanu Dienstag, 03. Dezember 13
  15. 15. 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 http://macstrac.blogspot.co.at/2009/04/scala-as-long-term-replacement-for.html @elmanu Dienstag, 03. Dezember 13
  16. 16. @elmanu Dienstag, 03. Dezember 13 ThoughtWorks TechRadar May 2013 http://www.thoughtworks.com/radar
  17. 17. @elmanu Dienstag, 03. Dezember 13 ThoughtWorks TechRadar May 2013 http://www.thoughtworks.com/radar
  18. 18. SCALA IN THE WILD etc. @elmanu Dienstag, 03. Dezember 13
  19. 19. SCALA IN THE WILD @elmanu Dienstag, 03. Dezember 13
  20. 20. SCALA IN THE WORLD http://www.scala-tribes.org/ @elmanu Dienstag, 03. Dezember 13
  21. 21. SCALA IN VIENNA • Scala Vienna •1 User Group year old, 124+ members • http://scala-vienna.org/ @elmanu Dienstag, 03. Dezember 13
  22. 22. AGENDA • History • Why Scala? • Scala in the wild • The Code / Scala in practice • Tools @elmanu Dienstag, 03. Dezember 13 & more
  23. 23. AVOIDING THE BILLIONDOLLAR 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 Dienstag, 03. Dezember 13
  24. 24. AVOIDING THE BILLIONDOLLAR 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 Dienstag, 03. Dezember 13
  25. 25. 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 Dienstag, 03. Dezember 13
  26. 26. CONCISENESS class var var var User( name: String, surname: String, 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 Dienstag, 03. Dezember 13
  27. 27. 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() { ! ! ! } ! @Override public boolean equals(Object that) { ! ! ! } } @elmanu Dienstag, 03. Dezember 13 // yada yada yada // yada yada yada
  28. 28. 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 Dienstag, 03. Dezember 13
  29. 29. USEFUL TYPE INFERENCE @elmanu Dienstag, 03. Dezember 13
  30. 30. USEFUL TYPE 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 Dienstag, 03. Dezember 13
  31. 31. EXPLICIT TYPING 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 Dienstag, 03. Dezember 13
  32. 32. 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 Dienstag, 03. Dezember 13
  33. 33. COLLECTION LIBRARY & FUNCTIONAL STYLE def sortByAge(user1: User, user2: User) = user1.age > user2.age users.sortWith(sortByAge) @elmanu Dienstag, 03. Dezember 13
  34. 34. COLLECTION LIBRARY & FUNCTIONAL STYLE users.sortWith((user1, user2) => user1.age > user2.age) @elmanu Dienstag, 03. Dezember 13
  35. 35. COLLECTION LIBRARY & FUNCTIONAL STYLE users.sortWith(_.age > _.age) @elmanu Dienstag, 03. Dezember 13
  36. 36. 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 Dienstag, 03. Dezember 13
  37. 37. COLLECTION LIBRARY & FUNCTIONAL STYLE val (minors, majors) = users.partition(_.age < 18) @elmanu Dienstag, 03. Dezember 13
  38. 38. COLLECTION LIBRARY & FUNCTIONAL STYLE val minors = users.filter(_.age < 18) @elmanu Dienstag, 03. Dezember 13
  39. 39. EXTENSIBLE LANGUAGE • Minimal language, powerful library • Language @elmanu Dienstag, 03. Dezember 13 features for extensibility
  40. 40. 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 Dienstag, 03. Dezember 13
  41. 41. 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 Dienstag, 03. Dezember 13
  42. 42. MACROS • Compile-time, during • Expanding type checking the AST • Experimental since Scala 2.10 http://scalamacros.org @elmanu Dienstag, 03. Dezember 13
  43. 43. MACROS PLAY JSON DE/SERIALIZATION @elmanu Dienstag, 03. Dezember 13
  44. 44. 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 Dienstag, 03. Dezember 13
  45. 45. MACROS PLAY JSON DE/SERIALIZATION import play.api.json._ implicit val creatureFormat = Json.format[Creature] // format is a macro @elmanu Dienstag, 03. Dezember 13
  46. 46. AGENDA • History • Why Scala? • Scala in the wild • The Code / Scala in practice • Tools @elmanu Dienstag, 03. Dezember 13 & more
  47. 47. IDE • IntelliJ IDEA • Eclipse • SublimeText @elmanu Dienstag, 03. Dezember 13
  48. 48. SIMPLE BUILD TOOL 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 Dienstag, 03. Dezember 13
  49. 49. PLAY! FRAMEWORK • MVC web framework, inspired by RoR and Django • Java, Scala • Everything is compiled & scalable performance • Predictable • Fun to work with! @elmanu Dienstag, 03. Dezember 13
  50. 50. PLAY! FRAMEWORK • MVC web framework, inspired by RoR and Django • Java, Scala • Everything is compiled & scalable performance • Predictable • Fun to work with! @elmanu Dienstag, 03. Dezember 13
  51. 51. AKKA • Toolkit for building concurrent & distributed applications more easily • Actors as concurrency model, simpler to reason with than threads • Remoting and clustering support @elmanu Dienstag, 03. Dezember 13
  52. 52. REACTIVE http://www.reactivemanifesto.org Dienstag, 03. Dezember 13
  53. 53. THANK YOU! Questions, comments ? http://manuel.bernhardt.io manuel@bernhardt.io @elmanu @elmanu Dienstag, 03. Dezember 13
  54. 54. FRAMEWORKS: AKKA • Actor concurrency model based on Erlang • “Human” design: actors hierarchies • Much, much, much threads @elmanu Dienstag, 03. Dezember 13 talk to eachother and form simpler to work and reason with than
  55. 55. FRAMEWORKS: AKKA Source: http://prabhubuzz.wordpress.com/2012/09/28/akka-really-mountains-of-concurrency/ @elmanu Dienstag, 03. Dezember 13
  56. 56. FRAMEWORKS: AKKA class Master extends Actor { ! val workers = context.actorOf(Props[Worker].withRouter( ! RoundRobinRouter(nrOfInstances = 5)) ! ) ! ! ! ! ! case Start => ! getDocumentsFromDb.foreach { document => ! ! workers ! Process(document) ! } ! ! case Result(processed) => ! writeResult(processed) ! ! ! ! case Stop => ! children.foreach(stop) ! } Dienstag, 03. Dezember 13 ! ! ! ! ! ! @elmanu def receive = { }
  57. 57. FRAMEWORKS: AKKA class Worker extends Actor { ! def receive = { ! ! ! ! } @elmanu Dienstag, 03. Dezember 13 ! case Process(doc: Document) => ! ! val processed = doSomeHardWork(doc) ! ! sender ! Result(processed) }
  58. 58. FRAMEWORKS: PLAY • MVC framework à la Rails • Everything •I is compiled mean everything: CSS, JavaScripts, Templates, URLs, JSON, ... @elmanu Dienstag, 03. Dezember 13
  59. 59. FRAMEWORKS: PLAY GET POST PUT DELETE @elmanu Dienstag, 03. Dezember 13 /users /users /users/:id/update /users/:id controllers.Users.list controllers.Users.create controllers.Users.update(id: Long) controllers.Users.delete(id: Long)
  60. 60. FRAMEWORKS: PLAY class Users extends Controller { def list = Action { request => val users = User.findAll Ok(Json.toJson(users)) } } @elmanu Dienstag, 03. Dezember 13
  61. 61. FRAMEWORKS: PLAY class Users extends Controller { def list = Action { request => val users = User.findAll Ok(Json.toJson(users)) } } @elmanu Dienstag, 03. Dezember 13 200 OK Content-Type: application/json

×