SlideShare a Scribd company logo
Scala
f o r J a v a P r o g r a m m e r s
Hello, Scala!
Copyright © 2013 Akira Koyasu. Some rights reserved.
Hello, World!
3
Copyright © 2013 Akira Koyasu. Some rights reserved.
Hello, World!
object HelloWorld {
def main(args: Array[String])
= println("Hello, World!")
}
3
Copyright © 2013 Akira Koyasu. Some rights reserved.
Agenda
About Scala
Features
4
Copyright © 2013 Akira Koyasu. Some rights reserved.
Motivation
Scalable language. To be scalable in the sense
that the same concepts can describe small as
well as large parts.
A unified and generalized object-oriented and
functional programming language provides
scalable support.
From Inventor
5
Copyright © 2013 Akira Koyasu. Some rights reserved.
Motivation
More productive as “better Java” with
existing Java resources.
Several concepts not in Java bring more
posibilities to you.
For Java programmers
6
Copyright © 2013 Akira Koyasu. Some rights reserved.
the Programming
Language
Language Specification
API
Runtime
7
Copyright © 2013 Akira Koyasu. Some rights reserved.
API
8
Scaladoc
Copyright © 2013 Akira Koyasu. Some rights reserved.
Runtime
scalac
.scala
.class
the compiler for .NET
is out of date
JVM
scala
Running on JVM
Compiler generates
class files
9
Copyright © 2013 Akira Koyasu. Some rights reserved.
Influencers
Java C#
Smalltalk
Haskell
Algol Simula
Eiffel
SML F#
Erlang
Iswim
Lisp
Python
Ruby
10
Copyright © 2013 Akira Koyasu. Some rights reserved.
Inventor
Martin Odersky
Professor of
programming methods at
EPFL in Switzerland
Designer of Java
generics
photo#1
11
Copyright © 2013 Akira Koyasu. Some rights reserved.
Object, Operator
val apple = new Apple
val orange = new Orange
println(apple + orange)
?
12
Copyright © 2013 Akira Koyasu. Some rights reserved.
Object, Operator
val apple = new Apple
val orange = new Orange
println(apple + orange)
?
(A) "Apple@xxxxOrange@xxxx"
(B) 2
(C) Compile error
(D) Runtime exception
(E) Others
12
Copyright © 2013 Akira Koyasu. Some rights reserved.
Features
Static typing & Suitable type inference
Object-oriented & Functional
Trait
Collaborating with Java
13
Copyright © 2013 Akira Koyasu. Some rights reserved.
Vorbose Java
Type declaration
public String suffix(String str) {
	 int pos = str.indexOf("-");
	 return str.substring(pos);
}
14
Copyright © 2013 Akira Koyasu. Some rights reserved.
Vorbose Java
Type declaration
def suffix(str: String) = {
val pos = str.indexOf("-")
str.substring(pos)
}
14
Copyright © 2013 Akira Koyasu. Some rights reserved.
Vorbose Java
JavaBeans
public class JavaBeans {
	 private String name;
	 public String getName() {
	 	 return name;
	 }
	 public void setName(String name) {
	 	 this.name = name;
	 }
}
15
Copyright © 2013 Akira Koyasu. Some rights reserved.
Vorbose Java
JavaBeans
case class ScalaCase(name: String)
15
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
variables
method parameters
method returns
Functions are the first-class values
16
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
Consider a method signature sending mails to
appropriate addresses from listing
def send() {
for(c: Contact <- listing()) {
mail(c)
}
}
17
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
18
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
age==20
18
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
age==20 def send(age: Int)
18
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
age==20
35<=age, age<=60
def send(age: Int)
18
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
age==20
35<=age, age<=60
def send(age: Int)
def send(minAge: Int, maxAge: Int)
18
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
age==20
35<=age, age<=60
age<30, gender:Male
def send(age: Int)
def send(minAge: Int, maxAge: Int)
18
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
age==20
35<=age, age<=60
age<30, gender:Male
def send(age: Int)
def send(minAge: Int, maxAge: Int)
def send(minAge: Int, maxAge: Int, g: Gender)
18
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
age==20
35<=age, age<=60
age<30, gender:Male
gender:Female, in Tokyo
def send(age: Int)
def send(minAge: Int, maxAge: Int)
def send(minAge: Int, maxAge: Int, g: Gender)
18
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
age==20
35<=age, age<=60
age<30, gender:Male
gender:Female, in Tokyo
def send(age: Int)
def send(minAge: Int, maxAge: Int)
def send(minAge: Int, maxAge: Int, g: Gender)
def send(minAge: Int, maxAge: Int, g: Gender, pref: String)
18
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
def send(p: Contact => Boolean) {
for(c: Contact <- listing()) {
if (p(c)) mail(c)
}
}
Apply condition function to method
19
Copyright © 2013 Akira Koyasu. Some rights reserved.
Functional
Programming
y = f(x)
Avoiding side effects
Conscious of immutability
20
Copyright © 2013 Akira Koyasu. Some rights reserved.
Partially applied
Function
21
def sum(a: Int, b: Int, c: Int) = a + b + c
val f1 = sum _
val f2 = sum(1, _: Int, 3)
def main(args: Array[String]) {
println(f1(1, 2, 3)) // 6
println(f2(2)) // 6
println(f2(5)) // 9
}
Copyright © 2013 Akira Koyasu. Some rights reserved.
Curried Function
22
def sum(a: Int)(b: Int) = a + b
def main(args: Array[String]) {
println(sum(1)(2)) // 3
}
Copyright © 2013 Akira Koyasu. Some rights reserved.
Curried Function
23
def withResource(r: Closeable)(op: => Unit) {
try {
op
} finally {
r.close()
}
}
	 	 	
def main(args: Array[String]) {
val writer = new FileWriter("test.txt")
withResource(writer) {
writer.write("foo bar")
}
}
Copyright © 2013 Akira Koyasu. Some rights reserved.
Trait
a special form of an abstract class
which can be used as mixins
24
Copyright © 2013 Akira Koyasu. Some rights reserved.
Trait
25
to enrich interface
class MyInt(val n: Int) extends Ordered[MyInt] {
def compare(that: MyInt)
= this.n - that.n
}
val n1 = new MyInt(1)
val n2 = new MyInt(2)
println(n1 < n2)
println(n1 > n2)
println(n1 <= n2)
println(n1 >= n2)
Copyright © 2013 Akira Koyasu. Some rights reserved.
Trait
26
stackable modifications
abstract class Sale {
def price(): Double
}
class BasicSale extends Sale {
def price() = 100;
}
trait OffTenPercent extends Sale {
abstract override
def price() = { super.price.toDouble * 0.9 }
}
trait OffTwenty extends Sale {
abstract override
def price() = { super.price - 20 }
}
-10%
-¥20
¥100
Copyright © 2013 Akira Koyasu. Some rights reserved.
Trait
27
stackable modifications
class UnbelievableSale
extends BasicSale with OffTenPercent
class UnbelievableSale2
extends BasicSale with OffTwenty
class UnbelievableSale3
extends BasicSale with OffTenPercent with OffTwenty
class UnbelievableSale4
extends BasicSale with OffTwenty with OffTenPercent
def main(args: Array[String]) {
println((new BasicSale).price) // 100.0
println((new UnbelievableSale).price) // 90.0
println((new UnbelievableSale2).price) // 80.0
println((new UnbelievableSale3).price) // 70.0
println((new UnbelievableSale4).price) // 72.0
}
-10%
-¥20
-10%, -¥20
-¥20, -10%
Copyright © 2013 Akira Koyasu. Some rights reserved.
Pattern Match
28
case class ScalaCase(name: String)
def test(x: Any) = x match {
case 1 => println("1")
case str: String => println(str)
case ScalaCase(name) => println("name: " + name)
case _ => println("other")
}
def main(args: Array[String]) {
test(1) // 1
test("Hello!") // Hello!
test(ScalaCase("apple")) // name: apple
test(2.5) // other
}
Copyright © 2013 Akira Koyasu. Some rights reserved.29
Scala in Action
Copyright © 2013 Akira Koyasu. Some rights reserved.
Collection
Operation
31
getting the highest score in 2013
case class Student(year: Int, score: Int)
def students(): List[Student] =
List(Student(2013, 92), Student(2012, 98), Student(2013, 70))
def students2(): List[Student] =
Student(2013, 92)::Student(2012, 98)::Student(2013, 70)::Nil
def highestScoreIn2013() = students()
.filter(s => s.year == 2013)
.map(s => s.score)
.foldLeft(0)((a, b) => max(a, b))
Copyright © 2013 Akira Koyasu. Some rights reserved.
Actor
32
actor
A
actor
B
actor
C
actor
D
No shared data
Exchanging messages
Concurrency model
Copyright © 2013 Akira Koyasu. Some rights reserved.
Actor (Akka)
33
object Actors {
implicit val system = ActorSystem("MySystem")
val a, b = actor(new Act {
become {
case ("ping", actor: ActorRef) => {
println("received ping")
Thread.sleep(1000)
actor ! ("pong", self)
}
case ("pong", actor: ActorRef) => {
println("received pong")
Thread.sleep(1000)
actor ! ("ping", self)
}
}
})
def main(args: Array[String]) {
a ! ("ping", b)
}
}
received ping
received pong
received ping
received pong
received ping
received pong
...
Copyright © 2013 Akira Koyasu. Some rights reserved.
Practical Scala
34
Copyright © 2013 Akira Koyasu. Some rights reserved.
Practical Scala
Killer framework Play (+)
Java on the bench (+)
Interactive shell (+)
There are many concepts (-)
the compiler needs more resources (-)
Backward compatibility? (-)
34
Copyright © 2013 Akira Koyasu. Some rights reserved.
Next Step
Implicit conversions
Extractor
Abstract type
Type parameter & variance
35
Copyright © 2013 Akira Koyasu. Some rights reserved.
Reference
An Overview of the Scala Programming
Language Second Edition (pdf)
A Scala Tutorial for Java programmers (pdf)
Programming in Scala, Second Edition
(Japanese version: Scala スケーラブルプロ
グラミング 第2版)
36
Copyright © 2013 Akira Koyasu. Some rights reserved.
Notes
This work is licensed under the Creative Commons Attribution-
NonCommercial 3.0 Unported License. To view a copy of this
license, visit http://creativecommons.org/licenses/by-nc/3.0/.
37
photo#1: http://en.wikipedia.org/wiki/File:Mark_Odersky_photo_by_Linda_Poeng.jpg
Feed backs Welcome!
http://twitter.com/akirakoyasu
http://fb.me/akirakoyasu
Thank you!

More Related Content

KEY
Hello, Guava !
PDF
Scala 2013 review
ODP
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
PDF
Scala vs Java 8 in a Java 8 World
PDF
Coding in Style
PDF
Polyglot JVM
PPT
Polyglot Programming in the JVM
PPTX
Joy of scala
Hello, Guava !
Scala 2013 review
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
Scala vs Java 8 in a Java 8 World
Coding in Style
Polyglot JVM
Polyglot Programming in the JVM
Joy of scala

What's hot (20)

PDF
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
PPTX
PPTX
Clojure And Swing
PDF
Scala introduction
KEY
Polyglot Grails
PDF
Scala vs java 8
PPT
Scala - brief intro
PDF
Functional programming in java
PPT
Functional Programming In Java
PPT
Scala introduction
PDF
Metaprogramming in Scala 2.10, Eugene Burmako,
PPTX
Should I Use Scalding or Scoobi or Scrunch?
PDF
awesome groovy
PDF
Scala in Places API
PDF
Scala - en bedre og mere effektiv Java?
ODP
Groovy intro for OUDL
PPTX
Intro to Functional Programming in Scala
PDF
Programming in Scala: Notes
PDF
Introduction to Scalding and Monoids
PDF
Spark Schema For Free with David Szakallas
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
Clojure And Swing
Scala introduction
Polyglot Grails
Scala vs java 8
Scala - brief intro
Functional programming in java
Functional Programming In Java
Scala introduction
Metaprogramming in Scala 2.10, Eugene Burmako,
Should I Use Scalding or Scoobi or Scrunch?
awesome groovy
Scala in Places API
Scala - en bedre og mere effektiv Java?
Groovy intro for OUDL
Intro to Functional Programming in Scala
Programming in Scala: Notes
Introduction to Scalding and Monoids
Spark Schema For Free with David Szakallas
Ad

Viewers also liked (12)

PDF
Garbage Collection for Dummies
KEY
Java, Moving Forward
PDF
Grizzly1.9.3x
KEY
Java, Up to Date
PDF
Tricks and Tips With NIO Using the Grizzly Framework
PPTX
Concurrency in Scala - the Akka way
PDF
Akka -- Scalability in Scala and Java
KEY
The Why and How of Scala at Twitter
PDF
Comparing JVM Web Frameworks - Devoxx France 2013
PDF
Play Framework: async I/O with Java and Scala
PDF
Event-sourced architectures with Akka
ZIP
Above the clouds: introducing Akka
Garbage Collection for Dummies
Java, Moving Forward
Grizzly1.9.3x
Java, Up to Date
Tricks and Tips With NIO Using the Grizzly Framework
Concurrency in Scala - the Akka way
Akka -- Scalability in Scala and Java
The Why and How of Scala at Twitter
Comparing JVM Web Frameworks - Devoxx France 2013
Play Framework: async I/O with Java and Scala
Event-sourced architectures with Akka
Above the clouds: introducing Akka
Ad

Similar to Scala for Java programmers (20)

PDF
Scala - core features
PPTX
An introduction to scala
ODP
PPTX
Softshake 2013: 10 reasons why java developers are jealous of Scala developers
PPTX
Scala, Play 2.0 & Cloud Foundry
PPTX
Taxonomy of Scala
PDF
Meet scala
PDF
(How) can we benefit from adopting scala?
PDF
Programming in scala - 1
PDF
Scala Intro
PDF
Getting Started With Scala
PDF
Getting Started With Scala
PDF
The Scala Programming Language
PDF
Scala taxonomy
PDF
Scala for Java Developers (Silicon Valley Code Camp 13)
PDF
Introduction to Scala
PPT
An introduction to scala
PDF
Scala: Object-Oriented Meets Functional, by Iulian Dragos
PDF
From Java to Scala - advantages and possible risks
PDF
Railroading into Scala
Scala - core features
An introduction to scala
Softshake 2013: 10 reasons why java developers are jealous of Scala developers
Scala, Play 2.0 & Cloud Foundry
Taxonomy of Scala
Meet scala
(How) can we benefit from adopting scala?
Programming in scala - 1
Scala Intro
Getting Started With Scala
Getting Started With Scala
The Scala Programming Language
Scala taxonomy
Scala for Java Developers (Silicon Valley Code Camp 13)
Introduction to Scala
An introduction to scala
Scala: Object-Oriented Meets Functional, by Iulian Dragos
From Java to Scala - advantages and possible risks
Railroading into Scala

More from 輝 子安 (9)

PDF
Protractor under the hood
PDF
そろそろLambda(CI/CD編)
PDF
Dockerで構成するWebサービス 〜EmotionTechの場合〜
PDF
Workshop: Docker on Elastic Beanstalk
PDF
PHP conference 2013 ja report
KEY
JavaOne Guide for the Petite Bourgeoisie
PDF
Java, Up to Date Sources
PDF
Hello, Guava ! samples
KEY
Tokyo Cabinet & Tokyo Tyrant
Protractor under the hood
そろそろLambda(CI/CD編)
Dockerで構成するWebサービス 〜EmotionTechの場合〜
Workshop: Docker on Elastic Beanstalk
PHP conference 2013 ja report
JavaOne Guide for the Petite Bourgeoisie
Java, Up to Date Sources
Hello, Guava ! samples
Tokyo Cabinet & Tokyo Tyrant

Recently uploaded (20)

PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
Machine learning based COVID-19 study performance prediction
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
Cloud computing and distributed systems.
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Modernizing your data center with Dell and AMD
PDF
KodekX | Application Modernization Development
PDF
Advanced IT Governance
PDF
Network Security Unit 5.pdf for BCA BBA.
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
cuic standard and advanced reporting.pdf
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Mobile App Security Testing_ A Comprehensive Guide.pdf
Big Data Technologies - Introduction.pptx
Machine learning based COVID-19 study performance prediction
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Spectral efficient network and resource selection model in 5G networks
Reach Out and Touch Someone: Haptics and Empathic Computing
Cloud computing and distributed systems.
Unlocking AI with Model Context Protocol (MCP)
Modernizing your data center with Dell and AMD
KodekX | Application Modernization Development
Advanced IT Governance
Network Security Unit 5.pdf for BCA BBA.
“AI and Expert System Decision Support & Business Intelligence Systems”
NewMind AI Monthly Chronicles - July 2025
Dropbox Q2 2025 Financial Results & Investor Presentation
The AUB Centre for AI in Media Proposal.docx
cuic standard and advanced reporting.pdf
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy

Scala for Java programmers

  • 1. Scala f o r J a v a P r o g r a m m e r s
  • 3. Copyright © 2013 Akira Koyasu. Some rights reserved. Hello, World! 3
  • 4. Copyright © 2013 Akira Koyasu. Some rights reserved. Hello, World! object HelloWorld { def main(args: Array[String]) = println("Hello, World!") } 3
  • 5. Copyright © 2013 Akira Koyasu. Some rights reserved. Agenda About Scala Features 4
  • 6. Copyright © 2013 Akira Koyasu. Some rights reserved. Motivation Scalable language. To be scalable in the sense that the same concepts can describe small as well as large parts. A unified and generalized object-oriented and functional programming language provides scalable support. From Inventor 5
  • 7. Copyright © 2013 Akira Koyasu. Some rights reserved. Motivation More productive as “better Java” with existing Java resources. Several concepts not in Java bring more posibilities to you. For Java programmers 6
  • 8. Copyright © 2013 Akira Koyasu. Some rights reserved. the Programming Language Language Specification API Runtime 7
  • 9. Copyright © 2013 Akira Koyasu. Some rights reserved. API 8 Scaladoc
  • 10. Copyright © 2013 Akira Koyasu. Some rights reserved. Runtime scalac .scala .class the compiler for .NET is out of date JVM scala Running on JVM Compiler generates class files 9
  • 11. Copyright © 2013 Akira Koyasu. Some rights reserved. Influencers Java C# Smalltalk Haskell Algol Simula Eiffel SML F# Erlang Iswim Lisp Python Ruby 10
  • 12. Copyright © 2013 Akira Koyasu. Some rights reserved. Inventor Martin Odersky Professor of programming methods at EPFL in Switzerland Designer of Java generics photo#1 11
  • 13. Copyright © 2013 Akira Koyasu. Some rights reserved. Object, Operator val apple = new Apple val orange = new Orange println(apple + orange) ? 12
  • 14. Copyright © 2013 Akira Koyasu. Some rights reserved. Object, Operator val apple = new Apple val orange = new Orange println(apple + orange) ? (A) "Apple@xxxxOrange@xxxx" (B) 2 (C) Compile error (D) Runtime exception (E) Others 12
  • 15. Copyright © 2013 Akira Koyasu. Some rights reserved. Features Static typing & Suitable type inference Object-oriented & Functional Trait Collaborating with Java 13
  • 16. Copyright © 2013 Akira Koyasu. Some rights reserved. Vorbose Java Type declaration public String suffix(String str) { int pos = str.indexOf("-"); return str.substring(pos); } 14
  • 17. Copyright © 2013 Akira Koyasu. Some rights reserved. Vorbose Java Type declaration def suffix(str: String) = { val pos = str.indexOf("-") str.substring(pos) } 14
  • 18. Copyright © 2013 Akira Koyasu. Some rights reserved. Vorbose Java JavaBeans public class JavaBeans { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 15
  • 19. Copyright © 2013 Akira Koyasu. Some rights reserved. Vorbose Java JavaBeans case class ScalaCase(name: String) 15
  • 20. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming variables method parameters method returns Functions are the first-class values 16
  • 21. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming Consider a method signature sending mails to appropriate addresses from listing def send() { for(c: Contact <- listing()) { mail(c) } } 17
  • 22. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming 18
  • 23. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming age==20 18
  • 24. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming age==20 def send(age: Int) 18
  • 25. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming age==20 35<=age, age<=60 def send(age: Int) 18
  • 26. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming age==20 35<=age, age<=60 def send(age: Int) def send(minAge: Int, maxAge: Int) 18
  • 27. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming age==20 35<=age, age<=60 age<30, gender:Male def send(age: Int) def send(minAge: Int, maxAge: Int) 18
  • 28. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming age==20 35<=age, age<=60 age<30, gender:Male def send(age: Int) def send(minAge: Int, maxAge: Int) def send(minAge: Int, maxAge: Int, g: Gender) 18
  • 29. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming age==20 35<=age, age<=60 age<30, gender:Male gender:Female, in Tokyo def send(age: Int) def send(minAge: Int, maxAge: Int) def send(minAge: Int, maxAge: Int, g: Gender) 18
  • 30. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming age==20 35<=age, age<=60 age<30, gender:Male gender:Female, in Tokyo def send(age: Int) def send(minAge: Int, maxAge: Int) def send(minAge: Int, maxAge: Int, g: Gender) def send(minAge: Int, maxAge: Int, g: Gender, pref: String) 18
  • 31. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming def send(p: Contact => Boolean) { for(c: Contact <- listing()) { if (p(c)) mail(c) } } Apply condition function to method 19
  • 32. Copyright © 2013 Akira Koyasu. Some rights reserved. Functional Programming y = f(x) Avoiding side effects Conscious of immutability 20
  • 33. Copyright © 2013 Akira Koyasu. Some rights reserved. Partially applied Function 21 def sum(a: Int, b: Int, c: Int) = a + b + c val f1 = sum _ val f2 = sum(1, _: Int, 3) def main(args: Array[String]) { println(f1(1, 2, 3)) // 6 println(f2(2)) // 6 println(f2(5)) // 9 }
  • 34. Copyright © 2013 Akira Koyasu. Some rights reserved. Curried Function 22 def sum(a: Int)(b: Int) = a + b def main(args: Array[String]) { println(sum(1)(2)) // 3 }
  • 35. Copyright © 2013 Akira Koyasu. Some rights reserved. Curried Function 23 def withResource(r: Closeable)(op: => Unit) { try { op } finally { r.close() } } def main(args: Array[String]) { val writer = new FileWriter("test.txt") withResource(writer) { writer.write("foo bar") } }
  • 36. Copyright © 2013 Akira Koyasu. Some rights reserved. Trait a special form of an abstract class which can be used as mixins 24
  • 37. Copyright © 2013 Akira Koyasu. Some rights reserved. Trait 25 to enrich interface class MyInt(val n: Int) extends Ordered[MyInt] { def compare(that: MyInt) = this.n - that.n } val n1 = new MyInt(1) val n2 = new MyInt(2) println(n1 < n2) println(n1 > n2) println(n1 <= n2) println(n1 >= n2)
  • 38. Copyright © 2013 Akira Koyasu. Some rights reserved. Trait 26 stackable modifications abstract class Sale { def price(): Double } class BasicSale extends Sale { def price() = 100; } trait OffTenPercent extends Sale { abstract override def price() = { super.price.toDouble * 0.9 } } trait OffTwenty extends Sale { abstract override def price() = { super.price - 20 } } -10% -¥20 ¥100
  • 39. Copyright © 2013 Akira Koyasu. Some rights reserved. Trait 27 stackable modifications class UnbelievableSale extends BasicSale with OffTenPercent class UnbelievableSale2 extends BasicSale with OffTwenty class UnbelievableSale3 extends BasicSale with OffTenPercent with OffTwenty class UnbelievableSale4 extends BasicSale with OffTwenty with OffTenPercent def main(args: Array[String]) { println((new BasicSale).price) // 100.0 println((new UnbelievableSale).price) // 90.0 println((new UnbelievableSale2).price) // 80.0 println((new UnbelievableSale3).price) // 70.0 println((new UnbelievableSale4).price) // 72.0 } -10% -¥20 -10%, -¥20 -¥20, -10%
  • 40. Copyright © 2013 Akira Koyasu. Some rights reserved. Pattern Match 28 case class ScalaCase(name: String) def test(x: Any) = x match { case 1 => println("1") case str: String => println(str) case ScalaCase(name) => println("name: " + name) case _ => println("other") } def main(args: Array[String]) { test(1) // 1 test("Hello!") // Hello! test(ScalaCase("apple")) // name: apple test(2.5) // other }
  • 41. Copyright © 2013 Akira Koyasu. Some rights reserved.29
  • 43. Copyright © 2013 Akira Koyasu. Some rights reserved. Collection Operation 31 getting the highest score in 2013 case class Student(year: Int, score: Int) def students(): List[Student] = List(Student(2013, 92), Student(2012, 98), Student(2013, 70)) def students2(): List[Student] = Student(2013, 92)::Student(2012, 98)::Student(2013, 70)::Nil def highestScoreIn2013() = students() .filter(s => s.year == 2013) .map(s => s.score) .foldLeft(0)((a, b) => max(a, b))
  • 44. Copyright © 2013 Akira Koyasu. Some rights reserved. Actor 32 actor A actor B actor C actor D No shared data Exchanging messages Concurrency model
  • 45. Copyright © 2013 Akira Koyasu. Some rights reserved. Actor (Akka) 33 object Actors { implicit val system = ActorSystem("MySystem") val a, b = actor(new Act { become { case ("ping", actor: ActorRef) => { println("received ping") Thread.sleep(1000) actor ! ("pong", self) } case ("pong", actor: ActorRef) => { println("received pong") Thread.sleep(1000) actor ! ("ping", self) } } }) def main(args: Array[String]) { a ! ("ping", b) } } received ping received pong received ping received pong received ping received pong ...
  • 46. Copyright © 2013 Akira Koyasu. Some rights reserved. Practical Scala 34
  • 47. Copyright © 2013 Akira Koyasu. Some rights reserved. Practical Scala Killer framework Play (+) Java on the bench (+) Interactive shell (+) There are many concepts (-) the compiler needs more resources (-) Backward compatibility? (-) 34
  • 48. Copyright © 2013 Akira Koyasu. Some rights reserved. Next Step Implicit conversions Extractor Abstract type Type parameter & variance 35
  • 49. Copyright © 2013 Akira Koyasu. Some rights reserved. Reference An Overview of the Scala Programming Language Second Edition (pdf) A Scala Tutorial for Java programmers (pdf) Programming in Scala, Second Edition (Japanese version: Scala スケーラブルプロ グラミング 第2版) 36
  • 50. Copyright © 2013 Akira Koyasu. Some rights reserved. Notes This work is licensed under the Creative Commons Attribution- NonCommercial 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/3.0/. 37 photo#1: http://en.wikipedia.org/wiki/File:Mark_Odersky_photo_by_Linda_Poeng.jpg Feed backs Welcome! http://twitter.com/akirakoyasu http://fb.me/akirakoyasu