Upload
dianne-marsh
View
578
Download
1
Embed Size (px)
DESCRIPTION
n this introduction to Scala, I will demonstrate why I love Scala and why I think that you will too. You’ll learn why you don’t need to go from 0 to functions and how you can ease yourself into this language. I’ll show you some Scala, compare it to Java, and give you pointers on how to start your journey into this functional object-oriented language.
Citation preview
DR. SCALALOVE
Dianne MarshDirector of Engineering -- Cloud Tools, NetflixScalaBay Meetup, Sept 2013
OR HOW
I LEARNED
TO STOP
WORRYING AND
LOVE FUNCTIONS
Dr. Strangelove, 1964
“If this thing turns out to be half as important
as I think it will be, I think you’ll all be in
line for some personal citations and
promotions when this thing is over.”
What is Scala?
Object-oriented + FunctionalRuns on JVMBuild on Java expertise
Why Is it Scary?
Early adopters scared folks awayLost elasticity of learning new programming languagesComfort zone
What’s the Gain?
Modern language featuresLet compiler work for you!
REPL
Interactive InterpreterRead Evaluate Print Loop
Type Inference
val x = 5
val y = "Once upon a time"
val l = List("This", "is", "a", "List")
Methods
def squareIt(x: Int) = x*x
Anatomy of a Case Classcase class Camera(width: Int, height: Int) { def megapixels = (width * height)/1000000.0 def HD = megapixels > 1.08}
val camera = new Camera(1024, 768)camera.megapixels is 0.786432camera.HD is falsecamera is "Camera(1024,768)"
Reducing Boilerplate
class Dimension(var height:Int,
var width:Int)
val c = new Dimension(5,7)
c.height is 5
c.height = 10
c.height is 10
c.width = 19
c.width is 19
Pattern Matching
def batteryIndicator(batteryLevel: Int) =
batteryLevel match {
case l if (l > 60) => "GREEN"
case l if (l > 20) => "YELLOW"
case _ => "RED"
}
Traits
trait Digital {
def batteryIndicator(batteryLevel:
Int) = …}
val d = new Camera(1024, 768) with Digital
d.batteryIndicator(56) is "YELLOW"
Functions are Objects
val v = Vector(19, 1, 7, 3, 2, 14)
v.sorted is Vector(1, 2, 3, 7, 14, 19)
v.sortWith((i, j) => j < i) is
Vector(19, 14, 7, 3, 2, 1)
It’s OK
To use Scala as a Better Java
Reaching into Java
import org.apache.commons.math._import stat.regression.SimpleRegression val r = new SimpleRegressionr.addData(1, 1)r.addData(2, 1.1)r.addData(3, 0.9)r.addData(4, 1.2)r.getN is 4r.predict(6) is 1.19
It’s OK
To be verbose
Verbose Version
// Euler1.scala
val nums = 3 until 1000
val somenums = nums.filter
(x => (x % 3 == 0 || x % 5 ==0))
var sum = 0
somenums.foreach(sum += _)
Find the Sweet Spot
// Euler2.scala
val nums = 3 until 1000
val somenums = nums filter
(x => (x % 3 == 0 || x % 5 ==0))
val sum = somenums reduceLeft
{(x:Int,y:Int) => x + y}
More than 1 way ...
// Euler3.scala
val nums = 3 until 1000
val somenums = nums filter
(x => (x % 3 == 0 || x % 5 ==0))
val sum = somenums.foldLeft(0)(_+_)
Back off if it’s too much
// Euler4.scala
val nums = 3 until 1000
val somenums = nums filter
(x => (x % 3 == 0 || x % 5 ==0))
(0/:somenums)(_+_)
Code should be readable
To your teamTo your customersTo yourself, in 6 months
Killer Apps in Scala
Compute intensiveConcurrency
Reactive applications● Resilient● Scalable● Interactive, single-page● Event Driven
Learning
Scala Koans -- scalakoans.orgCase Studies at TypesafeBlogsBooks
Practicing
Solve Euler problemsUse ScalaTestUse for non-production code
Contact Info
We are always hiring ...