Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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,783 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
  • Be the first to comment

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

×