introduction to scala
DESCRIPTION
Introduction to the Scala programming language @ the Java Klassentreffen 2013 in Vienna and Linz organized by http://www.javaklassentreffen.at Introducing the background, design goals, and some examples (from a Java perspective) http://java.at/web/guest/jkt13TRANSCRIPT
SCALAJava 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 todayother than Java, it would be Scala.
James GoslingFather 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 StrachanCreator of Groovy
@elmanu Java Klassentreffen 2013 - javatraining.at
ThoughtWorks TechRadar May 2013http://www.thoughtworks.com/radar
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA IN THE WILD
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA IN THE WILD
etc.
@elmanu Java Klassentreffen 2013 - javatraining.at
SCALA IN VIENNA
• 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 IN VIENNA
• Scala Vienna 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
AVOIDING THE 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
AVOIDING THE 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
CONCISENESSpublic 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
CONCISENESSclass User( var name: String, var surname: String, var email: String)
val bob = new User("Bob", "Marley", "[email protected]")// bob: User = User@5c3f1224
bob.name // res0: String = Bob
bob.name = "Bobby" // bob.name: String = Bobby
@elmanu Java Klassentreffen 2013 - javatraining.at
CONCISENESSpublic 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
CONCISENESScase class ImmutableUser( name: String, surname: String, email: String)
val bob = ImmutableUser("Bob", "Marley", "[email protected]")// 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
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 Java Klassentreffen 2013 - javatraining.at
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 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.Stackimport 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
MACROSPLAY JSON DE/SERIALIZATION
@elmanu Java Klassentreffen 2013 - javatraining.at
MACROSPLAY 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
MACROSPLAY 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 BUILD TOOLname := "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: AKKAclass 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.listPOST /users controllers.Users.createPUT /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
THANK YOU!
•Questions, comments ?
• http://logician.eu
•@elmanu