SlideShare a Scribd company logo
(c) 2013
All rights reserved
Oliver Szymanski
Source-Knights.com
jsxp.org
Scala
Copyright © 2010 Source-Knights.com
Oliver
• Independent Java Enterprise Consultant
• jsxp.org and source-knights.com
• One of the founders of the Association of Java User Groups (ijug.eu)
• Speaker on conferences
• JavaOne, DOAG, JAX, SourceTalk, ...
• Author for IT-magazines
• Writer (Fantasy, Thriller, Science Fiction)
oliver-szymanski.de
Copyright © 2010 Source-Knights.com
Overview
• Basics
• Data types
• Tuples
• Exceptions
• Modifiers
• Special Types
• Operators
• Code flow
• Classes
• Functions
• Matching
Copyright © 2010 Source-Knights.com
Basics
• Data types
• literals like
3.5 or 3.5d or 3.5D (double), 6 (integer), 3.5f or 3.5F (float)
• Basic types:
Byte, Short, Int, Long, Float, Double, Char, String, Boolean
• String Blocks: println("""Welcome to Simply Scala.
Click 'About' for more information.""")
• Alias: type MyAlias = String => Int
• Type intererence: only local
Copyright © 2010 Source-Knights.com
Basics
• Tuples
• val pair = ("answer", 42) // type: (String, Int)
pair._1 // "answer"
pair._2 // 42
• val (i,c)=(1,'a') // careful with the brackets on the left side
• Tuples are in reality case classes:
• case class Tuple2[A, B](_1: A, _2: B)
• Special syntax: tuple with x1, ..., xn can be written (x1, ..., xn)
• Example:
• def divmod(x: Int, y: Int) = new Tuple2[Int, Int](x / y, x % y)
Copyright © 2010 Source-Knights.com
Basics
• Exceptions
• no checked exceptions in Scala
• use throws annotation such that Java code can catch exception
• @throws(classOf[IOException])
Copyright © 2010 Source-Knights.com
Basics
• Modifiers
• Annotations, each on their own line (lower case name), some
java ones might be upper case
• Override modifier (override)
• Access modifier (protected, private)
(also with [packagenames, classnames or this]
• Final modifier (final)
Copyright © 2010 Source-Knights.com
Basics
• Special types
• Nothing (sub type of all other types)
• Null (sub type of all reference types)
• Unit (empty return type)
Copyright © 2010 Source-Knights.com
Basics
• Operators
• Colon/Doublepoint
• The associativity of an operator is determined by its last character:
Right-associative if ending with :
Left-associative otherwise.
• x :: y :: z = x :: (y :: z) whereas x + y + z = (x + y) + z
• x :: y = y.::(x) whereas x + y = x.+(y)
Copyright © 2010 Source-Knights.com
Code flow
• If condition: val try1 = if (1==2) 8 else 9 // equals
• while(total < 17) total += 3
• do { total+=3} while (total < 17)
• for(i <- 1 to 4) println("all four")
• for(i <- 1 until 4 ; j <- 1 to 3) println(i, j)
• for(c<-"hello") println(c) // collections
• for (i <- List.range(from, to) if i % 2 == 0) yield i
// for-comprehension for constructing a list
Copyright © 2010 Source-Knights.com
Example: Own loop
object Loop extends App {
def loop(body: => Unit): LoopUnlessCond = new LoopUnlessCond(body)
protected class LoopUnlessCond(body: => Unit) {
  def unless(cond: => Boolean) {
    body
    if (!cond) unless(cond)
  }
}
var i = 10
loop {
  println("i = " + i)
  i -= 1
} unless (i == 0)
}
Copyright © 2010 Source-Knights.com
Classes
• should be named in the CamelCase
• scala.AnyRef is base topmost class
class Point(ix:Int,iy:Int) {
var x = ix
var y = iy
}
class Point {
var x = 0
var y = 0
}
val p = new Point
p.x = 3
p.y = 4
Copyright © 2010 Source-Knights.com
Classes
// precondition, triggering an IllegalArgumentException
require(y > 0, "y must be positive")
// auxiliary constructor
def this(x: Int) = { ... }
// private method
private def test(a: Int): Int = { ... }
// allow access to package/subpackages/classes
protected[packagename] def test2(a: Int): Int = { ... }
// allow access to subclasses but only same instance
protected[this] def test3(a: Int): Int = { ... }
// overridden method
override def toString = { member1 + ", " + member2 }
Copyright © 2010 Source-Knights.com
Methods
class Point(ix:Int, iy:Int) {
var x = ix
var y = iy
def +(newpt:Point):Point = {
new Point(x+newpt.x, y+newpt.y)
}
}
Copyright © 2010 Source-Knights.com
Traits
trait HasXString {
val x : String // abstract field (no value)
}
trait Ord {
def < (that: Any): Boolean // this is an abstract method
def <=(that: Any): Boolean = (this < that) || (this == that)
def > (that: Any): Boolean = !(this <= that)
def >=(that: Any): Boolean = !(this < that)
}
Copyright © 2010 Source-Knights.com
Traits
class Date(y: Int, m: Int, d: Int) extends Ord {
def year = y
def month = m
def day = d
//Implement the abstract trait method
def <(that: Any): Boolean = {
if (!that.isInstanceOf[Date]) error("cannot compare”)
val o = that.asInstanceOf[Date]
// latest expression is return value
(year < o.year) || (year == o.year && (month < o.month ||
(month == o.month && day < o.day)))
}
Copyright © 2010 Source-Knights.com
Mixin
• def foo(bar: Cloneable with Resetable): Cloneable = { /*...*/ }
• class Iter extends StringIterator(args(0)) with RichIterator
• first parent is called thesuperclass of Iter, whereas the second
(and every other, if present) parent is called a mixin.
Copyright © 2010 Source-Knights.com
Case Classes
• case class Sum(l: Tree, r: Tree) extends Tree
• auto creation of a toString method, copy methods, equals
and hashCode methods, getter methods for construction
parameters
• creates Companion object with factory methods to avoid
“new” operator
Copyright © 2010 Source-Knights.com
Companion objects
• single instance Objects can be defined like
object Bar {
def apply(foo: String) = new Bar(foo)
}
• We speak of a companion object if same name as a class
• usually used as a factory
• as a class does not have static members use companion
objects instead
Copyright © 2010 Source-Knights.com
Parameters
• Named parameters and default values
class HashMap[K,V](initialCapacity:Int = 16, loadFactor:Float = 0.75) {...}
// Uses the defaults
val m1 = new HashMap[String,Int]
// initialCapacity 20, default loadFactor
val m2= new HashMap[String,Int](20)
// overriding both
val m3 = new HashMap[String,Int](20,0.8)
// override only the loadFactory via
// named arguments
val m4 = new HashMap[String,Int](loadFactor = 0.8)
Copyright © 2010 Source-Knights.com
Functions
• defined with def keyword
• usually having parameters and a return type
• return type can be guessed (not if recursion)
• Tuples are possible, use “Unit” as empty return type
def isDivisibleBy(k: Int): Int => Boolean = {
println("evaluating isDivisibleBy")
i => i % k == 0
}
val isEven = isDivisibleBy(2) // only calls isDivisibeBy once
def isEven = isDivisibleBy(2) // calls isDivisibleBy everytime
isEven(9)
Copyright © 2010 Source-Knights.com
Functions
• Functions are technically an object with an apply method
• val func = (x) => x + 1 // creates a function object
• def func = (x) => x + 1 // creates a function (or method in
class context)
• A Function is a set of traits
• Specifically, a function that takes one argument is an instance
of a Function1 trait.
scala> object addOne extends Function1[Int, Int] {
def apply(m: Int): Int = m + 1 }
defined module addOne
A nice short-hand for extends Function1[Int, Int] is extends (Int => Int)
Copyright © 2010 Source-Knights.com
Functions
//Anonymous functions
(x: Int) => x + 1
val addOne = (x: Int) => x + 1
// Function as parameter
filter(lst, (x:String) => x.length() > 3)
def filter(inLst:List[Int],cond:(Int)=>Boolean):List[Int]={
if(inLst==Nil) Nil
else if(cond(inLst.head)) inLst.head::filter(inLst.tail,cond)
else filter(inLst.tail,cond)
}
Copyright © 2010 Source-Knights.com
More features with function
Currying:
def f(a: Int, b: Int): Int // uncurried version (uncurried type is (Int, Int) => Int)
def f(a: Int)(b: Int): Int // curried version (curried type is Int => Int => Int)
def g = f(2)
Higher Order functions: using functions as parameters and returning a
function
Composition of functions with f compose g or f andThen g is possible
Copyright © 2010 Source-Knights.com
Evaluation rules
• def example = a+b // evaluated when called
• val example = a+b // evaluated immediately
• lazy val example = a +b // evaluated once when needed
• def square(x: Double) // call by value
• def square(x: => Double) // call by name
• evaluates the function first, and then evaluates the arguments if
need be
• avoids evaluation of arguments when the parameter is not used
at all by the function.
Copyright © 2010 Source-Knights.com
Matching
• each case is a Partial Function
def decode(n:Int){
println(n match {
case 1 => "One"
case 2 => "Two"
case 3 => "Three"
case _ => "Error" // _ is wildcard, like default
} ) }
Copyright © 2010 Source-Knights.com
Matching
• Pattern matching can be used with match
val res1 = Option(3)
// We want to multiply the number by 2, otherwise return 0.
val result = if (res1.isDefined) { res1.get * 2 } else { 0 }
// getOrElse lets you easily define a default value.
val result = res1.getOrElse(0) * 2
// Pattern matching fits naturally with Option.
val result = res1 match {
case Some(n) => n * 2
case None => 0
}
Copyright © 2010 Source-Knights.com
Outlook
• Collections
• methods: map, foreach, filter, zip, partition, find, drop,
foldLeft, flatten, flatMap...
• even concurrent collections for parallel processing
• Immutable/Mutable
• side effects, predictability, multi-threading
• Streams (like List, but tail is evaluated only on demand)
• Generics
• Implicits/Views
• classes/objects/functions/parameters...
Copyright © 2010 Source-Knights.com
Critics
Copyright © 2010 Source-Knights.com
Agile Tour London
• Friday 1st November 2013
• Combine the holiday for a long weekend in London ;)
• http://www.agiletourlondon.co.uk
Copyright © 2013 Source-Knights.com
Thxalot
Question?
oliver.szymanski@source-knights.com
(c) 2013
All rights reserved

More Related Content

PDF
Scala cheatsheet
PDF
Scala jargon cheatsheet
PPTX
Java class 5
PDF
Python programming : Abstract classes interfaces
PDF
Java Day-5
PPT
String and string manipulation
PPTX
Java string handling
PDF
Few simple-type-tricks in scala
Scala cheatsheet
Scala jargon cheatsheet
Java class 5
Python programming : Abstract classes interfaces
Java Day-5
String and string manipulation
Java string handling
Few simple-type-tricks in scala

What's hot (20)

PDF
Python3
PPTX
Python Programming Essentials - M20 - Classes and Objects
PPSX
String and string manipulation x
PPTX
Python: Basic Inheritance
PDF
Swift in SwiftUI
PPTX
Cats in Scala
PDF
Swift for TensorFlow - CoreML Personalization
PPTX
Scala Back to Basics: Type Classes
PPT
Intermediate JavaScript
PDF
Introduction to Scala for JCConf Taiwan
PPTX
Session 15 - Collections - Array List
PDF
From android/java to swift (3)
KEY
Xtext Eclipse Con
PDF
Property based Testing - generative data & executable domain rules
PPT
Core Java Concepts
PDF
Grammarware Memes
PDF
Hey! There's OCaml in my Rust!
PPT
PDF
Scala-对Java的修正和超越
Python3
Python Programming Essentials - M20 - Classes and Objects
String and string manipulation x
Python: Basic Inheritance
Swift in SwiftUI
Cats in Scala
Swift for TensorFlow - CoreML Personalization
Scala Back to Basics: Type Classes
Intermediate JavaScript
Introduction to Scala for JCConf Taiwan
Session 15 - Collections - Array List
From android/java to swift (3)
Xtext Eclipse Con
Property based Testing - generative data & executable domain rules
Core Java Concepts
Grammarware Memes
Hey! There's OCaml in my Rust!
Scala-对Java的修正和超越
Ad

Viewers also liked (17)

PDF
Scala tutorial
PPTX
Python for Beginners - How to Learn Python Easily
PPTX
Python interview question for students
PDF
Efficient Data Storage for Analytics with Parquet 2.0 - Hadoop Summit 2014
PDF
Sparkcamp @ Strata CA: Intro to Apache Spark with Hands-on Tutorials
PDF
Apache Spark Introduction - CloudxLab
PDF
Intro to apache spark stand ford
ZIP
Why Scala for Web 2.0?
PPTX
Scalable and Flexible Machine Learning With Scala @ LinkedIn
PDF
Why Scala Is Taking Over the Big Data World
PPTX
Scala - The Simple Parts, SFScala presentation
PDF
Apache Spark Tutorial
PPTX
A Brief Intro to Scala
PPTX
Introduction to Apache Spark
PPS
Introductory Lecture on photography
PPS
Skeletal system
PDF
Introduction to Functional Programming with Scala
Scala tutorial
Python for Beginners - How to Learn Python Easily
Python interview question for students
Efficient Data Storage for Analytics with Parquet 2.0 - Hadoop Summit 2014
Sparkcamp @ Strata CA: Intro to Apache Spark with Hands-on Tutorials
Apache Spark Introduction - CloudxLab
Intro to apache spark stand ford
Why Scala for Web 2.0?
Scalable and Flexible Machine Learning With Scala @ LinkedIn
Why Scala Is Taking Over the Big Data World
Scala - The Simple Parts, SFScala presentation
Apache Spark Tutorial
A Brief Intro to Scala
Introduction to Apache Spark
Introductory Lecture on photography
Skeletal system
Introduction to Functional Programming with Scala
Ad

Similar to Scala: A brief tutorial (20)

PDF
Meet scala
PDF
Introduction à Scala - Michel Schinz - January 2010
PDF
Programming in scala - 1
PDF
(How) can we benefit from adopting scala?
PDF
Scala or functional programming from a python developer's perspective
PDF
Power of functions in a typed world
PPTX
PPTX
Scala for curious
PPT
An introduction to scala
PDF
Scala - core features
PPT
Functional object
PDF
Lecture 5: Functional Programming
PDF
Scala Paradigms
PDF
Invitation to Scala
PDF
Introduction To Scala
PDF
Functional Operations - Susan Potter
ODP
PDF
Scala for Java Developers
ODP
Functional programming with Scala
PDF
Introductiontoprogramminginscala
Meet scala
Introduction à Scala - Michel Schinz - January 2010
Programming in scala - 1
(How) can we benefit from adopting scala?
Scala or functional programming from a python developer's perspective
Power of functions in a typed world
Scala for curious
An introduction to scala
Scala - core features
Functional object
Lecture 5: Functional Programming
Scala Paradigms
Invitation to Scala
Introduction To Scala
Functional Operations - Susan Potter
Scala for Java Developers
Functional programming with Scala
Introductiontoprogramminginscala

Recently uploaded (20)

PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
KodekX | Application Modernization Development
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Electronic commerce courselecture one. Pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
cuic standard and advanced reporting.pdf
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PPTX
A Presentation on Artificial Intelligence
20250228 LYD VKU AI Blended-Learning.pptx
Diabetes mellitus diagnosis method based random forest with bat algorithm
Review of recent advances in non-invasive hemoglobin estimation
Advanced methodologies resolving dimensionality complications for autism neur...
Building Integrated photovoltaic BIPV_UPV.pdf
KodekX | Application Modernization Development
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Understanding_Digital_Forensics_Presentation.pptx
Digital-Transformation-Roadmap-for-Companies.pptx
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing
Encapsulation_ Review paper, used for researhc scholars
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Electronic commerce courselecture one. Pdf
Spectral efficient network and resource selection model in 5G networks
cuic standard and advanced reporting.pdf
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
A Presentation on Artificial Intelligence

Scala: A brief tutorial

  • 1. (c) 2013 All rights reserved Oliver Szymanski Source-Knights.com jsxp.org Scala
  • 2. Copyright © 2010 Source-Knights.com Oliver • Independent Java Enterprise Consultant • jsxp.org and source-knights.com • One of the founders of the Association of Java User Groups (ijug.eu) • Speaker on conferences • JavaOne, DOAG, JAX, SourceTalk, ... • Author for IT-magazines • Writer (Fantasy, Thriller, Science Fiction) oliver-szymanski.de
  • 3. Copyright © 2010 Source-Knights.com Overview • Basics • Data types • Tuples • Exceptions • Modifiers • Special Types • Operators • Code flow • Classes • Functions • Matching
  • 4. Copyright © 2010 Source-Knights.com Basics • Data types • literals like 3.5 or 3.5d or 3.5D (double), 6 (integer), 3.5f or 3.5F (float) • Basic types: Byte, Short, Int, Long, Float, Double, Char, String, Boolean • String Blocks: println("""Welcome to Simply Scala. Click 'About' for more information.""") • Alias: type MyAlias = String => Int • Type intererence: only local
  • 5. Copyright © 2010 Source-Knights.com Basics • Tuples • val pair = ("answer", 42) // type: (String, Int) pair._1 // "answer" pair._2 // 42 • val (i,c)=(1,'a') // careful with the brackets on the left side • Tuples are in reality case classes: • case class Tuple2[A, B](_1: A, _2: B) • Special syntax: tuple with x1, ..., xn can be written (x1, ..., xn) • Example: • def divmod(x: Int, y: Int) = new Tuple2[Int, Int](x / y, x % y)
  • 6. Copyright © 2010 Source-Knights.com Basics • Exceptions • no checked exceptions in Scala • use throws annotation such that Java code can catch exception • @throws(classOf[IOException])
  • 7. Copyright © 2010 Source-Knights.com Basics • Modifiers • Annotations, each on their own line (lower case name), some java ones might be upper case • Override modifier (override) • Access modifier (protected, private) (also with [packagenames, classnames or this] • Final modifier (final)
  • 8. Copyright © 2010 Source-Knights.com Basics • Special types • Nothing (sub type of all other types) • Null (sub type of all reference types) • Unit (empty return type)
  • 9. Copyright © 2010 Source-Knights.com Basics • Operators • Colon/Doublepoint • The associativity of an operator is determined by its last character: Right-associative if ending with : Left-associative otherwise. • x :: y :: z = x :: (y :: z) whereas x + y + z = (x + y) + z • x :: y = y.::(x) whereas x + y = x.+(y)
  • 10. Copyright © 2010 Source-Knights.com Code flow • If condition: val try1 = if (1==2) 8 else 9 // equals • while(total < 17) total += 3 • do { total+=3} while (total < 17) • for(i <- 1 to 4) println("all four") • for(i <- 1 until 4 ; j <- 1 to 3) println(i, j) • for(c<-"hello") println(c) // collections • for (i <- List.range(from, to) if i % 2 == 0) yield i // for-comprehension for constructing a list
  • 11. Copyright © 2010 Source-Knights.com Example: Own loop object Loop extends App { def loop(body: => Unit): LoopUnlessCond = new LoopUnlessCond(body) protected class LoopUnlessCond(body: => Unit) {   def unless(cond: => Boolean) {     body     if (!cond) unless(cond)   } } var i = 10 loop {   println("i = " + i)   i -= 1 } unless (i == 0) }
  • 12. Copyright © 2010 Source-Knights.com Classes • should be named in the CamelCase • scala.AnyRef is base topmost class class Point(ix:Int,iy:Int) { var x = ix var y = iy } class Point { var x = 0 var y = 0 } val p = new Point p.x = 3 p.y = 4
  • 13. Copyright © 2010 Source-Knights.com Classes // precondition, triggering an IllegalArgumentException require(y > 0, "y must be positive") // auxiliary constructor def this(x: Int) = { ... } // private method private def test(a: Int): Int = { ... } // allow access to package/subpackages/classes protected[packagename] def test2(a: Int): Int = { ... } // allow access to subclasses but only same instance protected[this] def test3(a: Int): Int = { ... } // overridden method override def toString = { member1 + ", " + member2 }
  • 14. Copyright © 2010 Source-Knights.com Methods class Point(ix:Int, iy:Int) { var x = ix var y = iy def +(newpt:Point):Point = { new Point(x+newpt.x, y+newpt.y) } }
  • 15. Copyright © 2010 Source-Knights.com Traits trait HasXString { val x : String // abstract field (no value) } trait Ord { def < (that: Any): Boolean // this is an abstract method def <=(that: Any): Boolean = (this < that) || (this == that) def > (that: Any): Boolean = !(this <= that) def >=(that: Any): Boolean = !(this < that) }
  • 16. Copyright © 2010 Source-Knights.com Traits class Date(y: Int, m: Int, d: Int) extends Ord { def year = y def month = m def day = d //Implement the abstract trait method def <(that: Any): Boolean = { if (!that.isInstanceOf[Date]) error("cannot compare”) val o = that.asInstanceOf[Date] // latest expression is return value (year < o.year) || (year == o.year && (month < o.month || (month == o.month && day < o.day))) }
  • 17. Copyright © 2010 Source-Knights.com Mixin • def foo(bar: Cloneable with Resetable): Cloneable = { /*...*/ } • class Iter extends StringIterator(args(0)) with RichIterator • first parent is called thesuperclass of Iter, whereas the second (and every other, if present) parent is called a mixin.
  • 18. Copyright © 2010 Source-Knights.com Case Classes • case class Sum(l: Tree, r: Tree) extends Tree • auto creation of a toString method, copy methods, equals and hashCode methods, getter methods for construction parameters • creates Companion object with factory methods to avoid “new” operator
  • 19. Copyright © 2010 Source-Knights.com Companion objects • single instance Objects can be defined like object Bar { def apply(foo: String) = new Bar(foo) } • We speak of a companion object if same name as a class • usually used as a factory • as a class does not have static members use companion objects instead
  • 20. Copyright © 2010 Source-Knights.com Parameters • Named parameters and default values class HashMap[K,V](initialCapacity:Int = 16, loadFactor:Float = 0.75) {...} // Uses the defaults val m1 = new HashMap[String,Int] // initialCapacity 20, default loadFactor val m2= new HashMap[String,Int](20) // overriding both val m3 = new HashMap[String,Int](20,0.8) // override only the loadFactory via // named arguments val m4 = new HashMap[String,Int](loadFactor = 0.8)
  • 21. Copyright © 2010 Source-Knights.com Functions • defined with def keyword • usually having parameters and a return type • return type can be guessed (not if recursion) • Tuples are possible, use “Unit” as empty return type def isDivisibleBy(k: Int): Int => Boolean = { println("evaluating isDivisibleBy") i => i % k == 0 } val isEven = isDivisibleBy(2) // only calls isDivisibeBy once def isEven = isDivisibleBy(2) // calls isDivisibleBy everytime isEven(9)
  • 22. Copyright © 2010 Source-Knights.com Functions • Functions are technically an object with an apply method • val func = (x) => x + 1 // creates a function object • def func = (x) => x + 1 // creates a function (or method in class context) • A Function is a set of traits • Specifically, a function that takes one argument is an instance of a Function1 trait. scala> object addOne extends Function1[Int, Int] { def apply(m: Int): Int = m + 1 } defined module addOne A nice short-hand for extends Function1[Int, Int] is extends (Int => Int)
  • 23. Copyright © 2010 Source-Knights.com Functions //Anonymous functions (x: Int) => x + 1 val addOne = (x: Int) => x + 1 // Function as parameter filter(lst, (x:String) => x.length() > 3) def filter(inLst:List[Int],cond:(Int)=>Boolean):List[Int]={ if(inLst==Nil) Nil else if(cond(inLst.head)) inLst.head::filter(inLst.tail,cond) else filter(inLst.tail,cond) }
  • 24. Copyright © 2010 Source-Knights.com More features with function Currying: def f(a: Int, b: Int): Int // uncurried version (uncurried type is (Int, Int) => Int) def f(a: Int)(b: Int): Int // curried version (curried type is Int => Int => Int) def g = f(2) Higher Order functions: using functions as parameters and returning a function Composition of functions with f compose g or f andThen g is possible
  • 25. Copyright © 2010 Source-Knights.com Evaluation rules • def example = a+b // evaluated when called • val example = a+b // evaluated immediately • lazy val example = a +b // evaluated once when needed • def square(x: Double) // call by value • def square(x: => Double) // call by name • evaluates the function first, and then evaluates the arguments if need be • avoids evaluation of arguments when the parameter is not used at all by the function.
  • 26. Copyright © 2010 Source-Knights.com Matching • each case is a Partial Function def decode(n:Int){ println(n match { case 1 => "One" case 2 => "Two" case 3 => "Three" case _ => "Error" // _ is wildcard, like default } ) }
  • 27. Copyright © 2010 Source-Knights.com Matching • Pattern matching can be used with match val res1 = Option(3) // We want to multiply the number by 2, otherwise return 0. val result = if (res1.isDefined) { res1.get * 2 } else { 0 } // getOrElse lets you easily define a default value. val result = res1.getOrElse(0) * 2 // Pattern matching fits naturally with Option. val result = res1 match { case Some(n) => n * 2 case None => 0 }
  • 28. Copyright © 2010 Source-Knights.com Outlook • Collections • methods: map, foreach, filter, zip, partition, find, drop, foldLeft, flatten, flatMap... • even concurrent collections for parallel processing • Immutable/Mutable • side effects, predictability, multi-threading • Streams (like List, but tail is evaluated only on demand) • Generics • Implicits/Views • classes/objects/functions/parameters...
  • 29. Copyright © 2010 Source-Knights.com Critics
  • 30. Copyright © 2010 Source-Knights.com Agile Tour London • Friday 1st November 2013 • Combine the holiday for a long weekend in London ;) • http://www.agiletourlondon.co.uk
  • 31. Copyright © 2013 Source-Knights.com Thxalot Question? oliver.szymanski@source-knights.com (c) 2013 All rights reserved