scala intro
Post on 28-Jan-2015
124 Views
Preview:
DESCRIPTION
TRANSCRIPT
Scala Introval you = new Developer[Any] with ScalaKnowledge
Mig
Alex
Is Scala really hard
Can I start using it without going mad
Why zombies
Scala History
Scala2003 AD
MartinOdersky
bull Pizzabull GJbull generics in Javabull Funnel bull Scala
Scala is a pure object-oriented language
Scala is also a functional language
Strongly statically typed
Runs on JVM compiles to bytecode
Scala ndash scalable language
def factorial(x BigInt) BigInt = if (x == 0) 1 else x factorial(x - 1)
In contrast with C++ the more you study Scala the easier it gets
Unknown Scala community member
Scala in Production
httpwwwscala-langorgoldnode1658
Hello hellip
object HelloZombie extends App println(Hello + Zombie)
Another Hello
object HelloZombie def main(args Array[String]) println(Hello + Zombie)
httpwwwscala-langorgoldnode8610html
You do not need CS degree to code in Scala
Application ProgrammersA1 ndash A3 levels
Library DesignersL1 ndash L3 levels
laquoOne can program very productively in Scala on level A1 which one should be able to pick up in a day or so coming from Java
Mastering A2 will doubtlessly increase programmer productivity
A3 is for expert programmers with more specialized tasks not everyone needs to get to that levelraquo
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Mig
Alex
Is Scala really hard
Can I start using it without going mad
Why zombies
Scala History
Scala2003 AD
MartinOdersky
bull Pizzabull GJbull generics in Javabull Funnel bull Scala
Scala is a pure object-oriented language
Scala is also a functional language
Strongly statically typed
Runs on JVM compiles to bytecode
Scala ndash scalable language
def factorial(x BigInt) BigInt = if (x == 0) 1 else x factorial(x - 1)
In contrast with C++ the more you study Scala the easier it gets
Unknown Scala community member
Scala in Production
httpwwwscala-langorgoldnode1658
Hello hellip
object HelloZombie extends App println(Hello + Zombie)
Another Hello
object HelloZombie def main(args Array[String]) println(Hello + Zombie)
httpwwwscala-langorgoldnode8610html
You do not need CS degree to code in Scala
Application ProgrammersA1 ndash A3 levels
Library DesignersL1 ndash L3 levels
laquoOne can program very productively in Scala on level A1 which one should be able to pick up in a day or so coming from Java
Mastering A2 will doubtlessly increase programmer productivity
A3 is for expert programmers with more specialized tasks not everyone needs to get to that levelraquo
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Is Scala really hard
Can I start using it without going mad
Why zombies
Scala History
Scala2003 AD
MartinOdersky
bull Pizzabull GJbull generics in Javabull Funnel bull Scala
Scala is a pure object-oriented language
Scala is also a functional language
Strongly statically typed
Runs on JVM compiles to bytecode
Scala ndash scalable language
def factorial(x BigInt) BigInt = if (x == 0) 1 else x factorial(x - 1)
In contrast with C++ the more you study Scala the easier it gets
Unknown Scala community member
Scala in Production
httpwwwscala-langorgoldnode1658
Hello hellip
object HelloZombie extends App println(Hello + Zombie)
Another Hello
object HelloZombie def main(args Array[String]) println(Hello + Zombie)
httpwwwscala-langorgoldnode8610html
You do not need CS degree to code in Scala
Application ProgrammersA1 ndash A3 levels
Library DesignersL1 ndash L3 levels
laquoOne can program very productively in Scala on level A1 which one should be able to pick up in a day or so coming from Java
Mastering A2 will doubtlessly increase programmer productivity
A3 is for expert programmers with more specialized tasks not everyone needs to get to that levelraquo
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Scala History
Scala2003 AD
MartinOdersky
bull Pizzabull GJbull generics in Javabull Funnel bull Scala
Scala is a pure object-oriented language
Scala is also a functional language
Strongly statically typed
Runs on JVM compiles to bytecode
Scala ndash scalable language
def factorial(x BigInt) BigInt = if (x == 0) 1 else x factorial(x - 1)
In contrast with C++ the more you study Scala the easier it gets
Unknown Scala community member
Scala in Production
httpwwwscala-langorgoldnode1658
Hello hellip
object HelloZombie extends App println(Hello + Zombie)
Another Hello
object HelloZombie def main(args Array[String]) println(Hello + Zombie)
httpwwwscala-langorgoldnode8610html
You do not need CS degree to code in Scala
Application ProgrammersA1 ndash A3 levels
Library DesignersL1 ndash L3 levels
laquoOne can program very productively in Scala on level A1 which one should be able to pick up in a day or so coming from Java
Mastering A2 will doubtlessly increase programmer productivity
A3 is for expert programmers with more specialized tasks not everyone needs to get to that levelraquo
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
MartinOdersky
bull Pizzabull GJbull generics in Javabull Funnel bull Scala
Scala is a pure object-oriented language
Scala is also a functional language
Strongly statically typed
Runs on JVM compiles to bytecode
Scala ndash scalable language
def factorial(x BigInt) BigInt = if (x == 0) 1 else x factorial(x - 1)
In contrast with C++ the more you study Scala the easier it gets
Unknown Scala community member
Scala in Production
httpwwwscala-langorgoldnode1658
Hello hellip
object HelloZombie extends App println(Hello + Zombie)
Another Hello
object HelloZombie def main(args Array[String]) println(Hello + Zombie)
httpwwwscala-langorgoldnode8610html
You do not need CS degree to code in Scala
Application ProgrammersA1 ndash A3 levels
Library DesignersL1 ndash L3 levels
laquoOne can program very productively in Scala on level A1 which one should be able to pick up in a day or so coming from Java
Mastering A2 will doubtlessly increase programmer productivity
A3 is for expert programmers with more specialized tasks not everyone needs to get to that levelraquo
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Scala is a pure object-oriented language
Scala is also a functional language
Strongly statically typed
Runs on JVM compiles to bytecode
Scala ndash scalable language
def factorial(x BigInt) BigInt = if (x == 0) 1 else x factorial(x - 1)
In contrast with C++ the more you study Scala the easier it gets
Unknown Scala community member
Scala in Production
httpwwwscala-langorgoldnode1658
Hello hellip
object HelloZombie extends App println(Hello + Zombie)
Another Hello
object HelloZombie def main(args Array[String]) println(Hello + Zombie)
httpwwwscala-langorgoldnode8610html
You do not need CS degree to code in Scala
Application ProgrammersA1 ndash A3 levels
Library DesignersL1 ndash L3 levels
laquoOne can program very productively in Scala on level A1 which one should be able to pick up in a day or so coming from Java
Mastering A2 will doubtlessly increase programmer productivity
A3 is for expert programmers with more specialized tasks not everyone needs to get to that levelraquo
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Scala ndash scalable language
def factorial(x BigInt) BigInt = if (x == 0) 1 else x factorial(x - 1)
In contrast with C++ the more you study Scala the easier it gets
Unknown Scala community member
Scala in Production
httpwwwscala-langorgoldnode1658
Hello hellip
object HelloZombie extends App println(Hello + Zombie)
Another Hello
object HelloZombie def main(args Array[String]) println(Hello + Zombie)
httpwwwscala-langorgoldnode8610html
You do not need CS degree to code in Scala
Application ProgrammersA1 ndash A3 levels
Library DesignersL1 ndash L3 levels
laquoOne can program very productively in Scala on level A1 which one should be able to pick up in a day or so coming from Java
Mastering A2 will doubtlessly increase programmer productivity
A3 is for expert programmers with more specialized tasks not everyone needs to get to that levelraquo
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
In contrast with C++ the more you study Scala the easier it gets
Unknown Scala community member
Scala in Production
httpwwwscala-langorgoldnode1658
Hello hellip
object HelloZombie extends App println(Hello + Zombie)
Another Hello
object HelloZombie def main(args Array[String]) println(Hello + Zombie)
httpwwwscala-langorgoldnode8610html
You do not need CS degree to code in Scala
Application ProgrammersA1 ndash A3 levels
Library DesignersL1 ndash L3 levels
laquoOne can program very productively in Scala on level A1 which one should be able to pick up in a day or so coming from Java
Mastering A2 will doubtlessly increase programmer productivity
A3 is for expert programmers with more specialized tasks not everyone needs to get to that levelraquo
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Scala in Production
httpwwwscala-langorgoldnode1658
Hello hellip
object HelloZombie extends App println(Hello + Zombie)
Another Hello
object HelloZombie def main(args Array[String]) println(Hello + Zombie)
httpwwwscala-langorgoldnode8610html
You do not need CS degree to code in Scala
Application ProgrammersA1 ndash A3 levels
Library DesignersL1 ndash L3 levels
laquoOne can program very productively in Scala on level A1 which one should be able to pick up in a day or so coming from Java
Mastering A2 will doubtlessly increase programmer productivity
A3 is for expert programmers with more specialized tasks not everyone needs to get to that levelraquo
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Hello hellip
object HelloZombie extends App println(Hello + Zombie)
Another Hello
object HelloZombie def main(args Array[String]) println(Hello + Zombie)
httpwwwscala-langorgoldnode8610html
You do not need CS degree to code in Scala
Application ProgrammersA1 ndash A3 levels
Library DesignersL1 ndash L3 levels
laquoOne can program very productively in Scala on level A1 which one should be able to pick up in a day or so coming from Java
Mastering A2 will doubtlessly increase programmer productivity
A3 is for expert programmers with more specialized tasks not everyone needs to get to that levelraquo
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Another Hello
object HelloZombie def main(args Array[String]) println(Hello + Zombie)
httpwwwscala-langorgoldnode8610html
You do not need CS degree to code in Scala
Application ProgrammersA1 ndash A3 levels
Library DesignersL1 ndash L3 levels
laquoOne can program very productively in Scala on level A1 which one should be able to pick up in a day or so coming from Java
Mastering A2 will doubtlessly increase programmer productivity
A3 is for expert programmers with more specialized tasks not everyone needs to get to that levelraquo
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
httpwwwscala-langorgoldnode8610html
You do not need CS degree to code in Scala
Application ProgrammersA1 ndash A3 levels
Library DesignersL1 ndash L3 levels
laquoOne can program very productively in Scala on level A1 which one should be able to pick up in a day or so coming from Java
Mastering A2 will doubtlessly increase programmer productivity
A3 is for expert programmers with more specialized tasks not everyone needs to get to that levelraquo
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Scala functional basics
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
1 - Mutability is evil
2 ndash Everyhting returns data
3 ndash Functions are first-class citizens
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Mutability is evil
bull Mutable objects are complicated to think about
bull Defensive copies
bull Need to be synchronized in multithreaded env
bull Unobvious side effects
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Mutability is evil
val salary = 2000$ salary = 2500$ does not compile
var salary = 2000$rdquosalary = 2500$rdquo compiles
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Everything returns data
val result = if (true) value1 else value2
val result = for (i lt- 1 to 10) yield i
def getRandom() = Mathrandom()
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
in Scala a function value is an object
Scala =gt pure OOP amp full-blown functional language
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Sooo many objects around
Baaaad performance yeah
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
httpreadwritecom20110606cpp-go-java-scala-performance-benchmark
Scala OOP basics
1 - Class
2 - Object = build-in singleton pattern
3 ndash Case class
4 ndash Abstract class vs Trait
5 ndash Multiple inheritance WAT Diamond problem solved
Class
Class is similar to any other languagesrsquo class notion
class MyZombie private val index Int = 0 val name String = Zombie0
Class + Constructor
class MyZombie(index Int val name String) println(me likes brainz)
Object
Objects are singletons
object LoneZombie def growl = println(me sooo sad)
Companion Object
class CrawlerZombie(name String) def crawl() = println(crawling) object CrawlerZombie def apply(name String) = println(name + is here) new CrawlerZombie(name)
val zombie = CrawlerZombie(Mig)zombiecrawl()
Case Class
Case class = class + ldquosugarrdquo + compiler hint
case class Zombie(index Int name String)
Case Class Sugar
1 Properties2 Pattern Matching3 Companion Object
Abstract class vs Trait
Abstract class defines structureTrait defines behaviour
Abstract Class
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
class Zombie(name String) extends Undead(name) def digest() = println(grab brainz)
Trait
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
trait Growling def growl(msg String) = println(msg) def scream(msg String) = println(msg + )
class Zombie(name String) extends Undead(name) with Growling def digest() = growl(grab brainz)
Scala Basic Types
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
1 - Class
2 - Object = build-in singleton pattern
3 ndash Case class
4 ndash Abstract class vs Trait
5 ndash Multiple inheritance WAT Diamond problem solved
Class
Class is similar to any other languagesrsquo class notion
class MyZombie private val index Int = 0 val name String = Zombie0
Class + Constructor
class MyZombie(index Int val name String) println(me likes brainz)
Object
Objects are singletons
object LoneZombie def growl = println(me sooo sad)
Companion Object
class CrawlerZombie(name String) def crawl() = println(crawling) object CrawlerZombie def apply(name String) = println(name + is here) new CrawlerZombie(name)
val zombie = CrawlerZombie(Mig)zombiecrawl()
Case Class
Case class = class + ldquosugarrdquo + compiler hint
case class Zombie(index Int name String)
Case Class Sugar
1 Properties2 Pattern Matching3 Companion Object
Abstract class vs Trait
Abstract class defines structureTrait defines behaviour
Abstract Class
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
class Zombie(name String) extends Undead(name) def digest() = println(grab brainz)
Trait
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
trait Growling def growl(msg String) = println(msg) def scream(msg String) = println(msg + )
class Zombie(name String) extends Undead(name) with Growling def digest() = growl(grab brainz)
Scala Basic Types
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Class
Class is similar to any other languagesrsquo class notion
class MyZombie private val index Int = 0 val name String = Zombie0
Class + Constructor
class MyZombie(index Int val name String) println(me likes brainz)
Object
Objects are singletons
object LoneZombie def growl = println(me sooo sad)
Companion Object
class CrawlerZombie(name String) def crawl() = println(crawling) object CrawlerZombie def apply(name String) = println(name + is here) new CrawlerZombie(name)
val zombie = CrawlerZombie(Mig)zombiecrawl()
Case Class
Case class = class + ldquosugarrdquo + compiler hint
case class Zombie(index Int name String)
Case Class Sugar
1 Properties2 Pattern Matching3 Companion Object
Abstract class vs Trait
Abstract class defines structureTrait defines behaviour
Abstract Class
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
class Zombie(name String) extends Undead(name) def digest() = println(grab brainz)
Trait
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
trait Growling def growl(msg String) = println(msg) def scream(msg String) = println(msg + )
class Zombie(name String) extends Undead(name) with Growling def digest() = growl(grab brainz)
Scala Basic Types
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Class + Constructor
class MyZombie(index Int val name String) println(me likes brainz)
Object
Objects are singletons
object LoneZombie def growl = println(me sooo sad)
Companion Object
class CrawlerZombie(name String) def crawl() = println(crawling) object CrawlerZombie def apply(name String) = println(name + is here) new CrawlerZombie(name)
val zombie = CrawlerZombie(Mig)zombiecrawl()
Case Class
Case class = class + ldquosugarrdquo + compiler hint
case class Zombie(index Int name String)
Case Class Sugar
1 Properties2 Pattern Matching3 Companion Object
Abstract class vs Trait
Abstract class defines structureTrait defines behaviour
Abstract Class
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
class Zombie(name String) extends Undead(name) def digest() = println(grab brainz)
Trait
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
trait Growling def growl(msg String) = println(msg) def scream(msg String) = println(msg + )
class Zombie(name String) extends Undead(name) with Growling def digest() = growl(grab brainz)
Scala Basic Types
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Object
Objects are singletons
object LoneZombie def growl = println(me sooo sad)
Companion Object
class CrawlerZombie(name String) def crawl() = println(crawling) object CrawlerZombie def apply(name String) = println(name + is here) new CrawlerZombie(name)
val zombie = CrawlerZombie(Mig)zombiecrawl()
Case Class
Case class = class + ldquosugarrdquo + compiler hint
case class Zombie(index Int name String)
Case Class Sugar
1 Properties2 Pattern Matching3 Companion Object
Abstract class vs Trait
Abstract class defines structureTrait defines behaviour
Abstract Class
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
class Zombie(name String) extends Undead(name) def digest() = println(grab brainz)
Trait
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
trait Growling def growl(msg String) = println(msg) def scream(msg String) = println(msg + )
class Zombie(name String) extends Undead(name) with Growling def digest() = growl(grab brainz)
Scala Basic Types
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Companion Object
class CrawlerZombie(name String) def crawl() = println(crawling) object CrawlerZombie def apply(name String) = println(name + is here) new CrawlerZombie(name)
val zombie = CrawlerZombie(Mig)zombiecrawl()
Case Class
Case class = class + ldquosugarrdquo + compiler hint
case class Zombie(index Int name String)
Case Class Sugar
1 Properties2 Pattern Matching3 Companion Object
Abstract class vs Trait
Abstract class defines structureTrait defines behaviour
Abstract Class
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
class Zombie(name String) extends Undead(name) def digest() = println(grab brainz)
Trait
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
trait Growling def growl(msg String) = println(msg) def scream(msg String) = println(msg + )
class Zombie(name String) extends Undead(name) with Growling def digest() = growl(grab brainz)
Scala Basic Types
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Case Class
Case class = class + ldquosugarrdquo + compiler hint
case class Zombie(index Int name String)
Case Class Sugar
1 Properties2 Pattern Matching3 Companion Object
Abstract class vs Trait
Abstract class defines structureTrait defines behaviour
Abstract Class
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
class Zombie(name String) extends Undead(name) def digest() = println(grab brainz)
Trait
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
trait Growling def growl(msg String) = println(msg) def scream(msg String) = println(msg + )
class Zombie(name String) extends Undead(name) with Growling def digest() = growl(grab brainz)
Scala Basic Types
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Case Class Sugar
1 Properties2 Pattern Matching3 Companion Object
Abstract class vs Trait
Abstract class defines structureTrait defines behaviour
Abstract Class
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
class Zombie(name String) extends Undead(name) def digest() = println(grab brainz)
Trait
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
trait Growling def growl(msg String) = println(msg) def scream(msg String) = println(msg + )
class Zombie(name String) extends Undead(name) with Growling def digest() = growl(grab brainz)
Scala Basic Types
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Abstract class vs Trait
Abstract class defines structureTrait defines behaviour
Abstract Class
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
class Zombie(name String) extends Undead(name) def digest() = println(grab brainz)
Trait
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
trait Growling def growl(msg String) = println(msg) def scream(msg String) = println(msg + )
class Zombie(name String) extends Undead(name) with Growling def digest() = growl(grab brainz)
Scala Basic Types
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Abstract Class
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
class Zombie(name String) extends Undead(name) def digest() = println(grab brainz)
Trait
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
trait Growling def growl(msg String) = println(msg) def scream(msg String) = println(msg + )
class Zombie(name String) extends Undead(name) with Growling def digest() = growl(grab brainz)
Scala Basic Types
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Trait
abstract class Undead(name String) def eat() = println(Om nom nom) digest() def digest()
trait Growling def growl(msg String) = println(msg) def scream(msg String) = println(msg + )
class Zombie(name String) extends Undead(name) with Growling def digest() = growl(grab brainz)
Scala Basic Types
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Scala Basic Types
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
1 - Scala basic types are objects
2 ndash Scala implement itrsquos own types wraps and extends some Java classes and types
3 Scala operators are method calls
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Value type Range
Byte 8-bit signed twos complement integer (-27 to 27 - 1 inclusive)
Short 16-bit signed twos complement integer (-215 to 215 - 1 inclusive)
Int 32-bit signed twos complement integer (-231 to 231 - 1 inclusive)
Long 64-bit signed twos complement integer (-263 to 263 - 1 inclusive)
Char 16-bit unsigned Unicode character (0 to 216 - 1 inclusive)
String a sequence of Chars
Float 32-bit IEEE 754 single-precision float
Double 64-bit IEEE 754 double-precision float
Boolean true or false
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Operators are methods
Operators uses infix notation
val sum = 1 + 2 Scala invokes (1)+(2)
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Class Hierarchy
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Null
var zombie Zombie = nullzombie = new Zombie(Alex)
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Nothing
def throwLocalizedException(key String) Nothing = throw LocalizedException(resolveMessage(key))
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Functions vs methods
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Functions and methods are not the same
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
copy
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Functions
No side effectsEvaluates only body and parameters
Compiles to FunctionNDefined mostly in Objects
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Functions
object KillerModule def kill = (z Zombie) =gt println(Killing + zname)
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Methods
Defined in classesWorks with class scope
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Methods
class ZombieTortureMachine(z Zombie) def kill() = println(Killing + zname) def starve() = println(Starving + zname)
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Functions are first-class citizens
Assign function definitions to variables
val doubled = (xInt) =gt x 2
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Functions are first-class citizens
Pass function as a parameter
def traverseTree (callback (Element) =gt Unit) val element = Getting tree element callback(element)
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Functions are first-class citizens
Return function as a result value
def prepareCalculator(x Int y Int) () =gt Int = println(calculating) () =gt x + y
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Type Inference
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
You can omit types in declarations
The compiler will infer them for you
Less typing -gt less reading -gt happier developers
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Type inference with variables
private val index = 0val name = Zombie0
private val index Int = 0val name String = Zombie0
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Type inference with functions
Scala compiler can not read thoughts
def func (a Int b String) = a + b compiles
def func1 (a b) = a + b does not compile
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Type inference
def getZombies(severity Int) = if (severity gt 10) List() else List(Zombie(Mig) Zombie(Alex)) inferred type = List[Zombie]
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Lambda Syntax
val doubler = (n Int) =gt n 2
val yadobler = n Int =gt n 2
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Closures
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Closure is special kind of a function
Closure encloses the local lexical context inside the function body
Closures can be implemented using Anonymous classes in Java (yuck)
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Simple Closure
val multiplier = 2 val doubler = (n Int) =gt n multiplier
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Closure vs Function
Pure function calculates its result solely in terms of its arguments
Closure can use the outer lexical context for it computations One may say that it stores ldquoreferencesrdquo to the outer values
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Collections
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Sugar Map Initialization
Java
MapltString Integergt mappings = new HashMapltString Integergt() put(One 1) put(Two 2) put(Three 3)
Scala val mappings = Map( one -gt 1 two -gt 2 three -gt 3 )
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Sugar Filtering
Java
ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt()for (Integer number numbers) if (number lt 0) negativeNumbersadd(number)
Scala
val numbers = List(1 2 -55 -33 122) val negativeNumbers = numbersfilter(_ lt 0)
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Sugar Classification
Java ListltIntegergt numbers = new ArrayListltIntegergt() add(1) add(2) add(-55) add(-33) add(122)
ListltIntegergt negativeNumbers = new ArrayListltIntegergt() ListltIntegergt positiveNumbers = new ArrayListltIntegergt()
for (Integer number numbers) if (number lt 0) negativeNumbersadd(number) else positiveNumbersadd(number)
Scala val numbers = List(1 2 -55 -33 122) val (positiveNumbers negativeNumbers) = numbersspan(_ gt 0)
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Tuples
bull Tuples can be viewed as simple immutable collections
bull Tuple can contain up to 22 elements of different types
bull Very useful when you need to return a complex value from the expression
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Tuples
val pair = (22 zombies) val pair = (22 -gt zombies)
the type is Tuple2[Int String]
println(pair_1) println(pair_2)
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Mutable vs Immutable
Prefer immutable collections by default PeriodGoogle for details
Scala uses immutable collections by default
val map = Map(one -gt 1) results in scalacollectionimmutableMap[StringInt]
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Collections practices
Map Set and List are mostly used collections in Scala
Use traitsrsquo companion object calls to create collections when you do not need specific implementation
Map(one -gt 1) good HashMap(one -gt 1) not so good new HashMap(one -gt 1) wont compile )
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Collections API example 1
case class User(name String password String) val users = List(adminnimda user1asddsa rootqwerty)val mappedUsers = usersmap user =gt val splitted = usersplit() User(splitted(0) splitted(1)) List[User] = List(User(adminnimda) User(user1asddsa) User(rootqwerty))
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Collections API example 2
val names = List( AlexViktorEugeny DmitryYegor Sergey MichaelSergey)
val splitted = namesflatMap(_split()toList)distinct List(Alex Viktor Eugeny Dmitry Yegor Michael Sergey)
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Loops amp For comprehension
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Loops amp For comprehension
bull Scala has a while loopbull Scala has a do-while loopbull They are not expressions (the return type
is Unit)
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Loops amp For comprehension
Because the while loop results in no value it is often left out of pure functional languages
Such languages have expressions not loops
Scala includes the while loop nonetheless because sometimes an imperative solution can be more readable especially to programmers with a predominantly imperative background
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
While loop
while (brainssize gt 0) zombie eat brains
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Do-While loop
do zombie eat brains while (brainssize gt 0)
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Friendly advise
Try use recursion instead of loopsAnd donrsquot feed zombies
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
For expression
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
For expression
bull Looks like a for-loopbull Behaves as a swiss knife
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
For + generator
for (zombie lt- zombieHorde) kill(zombie)
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
For + generator + filter
for (zombie lt- zombieHorde if zombieisMoving) kill(zombie)
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
For + generator + filter + yield
This will produce a new collection
val killedZombies = for (zombie lt- zombieHorde if zombieisMoving) yield zombie
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
For expression
Can be used instead of map filter and flatMap combination
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Pattern Matching
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Simple matching
val status String = Rrdquo val translated = status match case R =gt runningrdquo case D =gt digestingrdquo case E =gt eating brainzrdquo case _ =gt X3
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Structure matchingcase class User(name String lastname String age Int) val users = List( User(Alexey Migutsky 25) User(Alexander Albul 27) User(John Doe 99)) val determined = usersmap case User(Alexey _ _) =gt Lrdquo case User(Alexander _ _) =gt Ardquo case _ =gt X3 mkString() LAX3
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Structure matching
def describe(list List[Int]) list match case first second third tail =gt println(First case) case head tail =gt println(Second case) case Nil =gt println(Empty list)
describe(List(123)) First case describe(List(1 2)) Second case describe(List()) Empty list
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Exception handling
try something catch case e IllegalArgumentException =gt println(Illegal argument) case _ =gt println(Unknown exception)
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Implicits
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Implicits
The compiler can insert parameters and call conversion methods automatically based on the types used
This behavior can be achieved using the implicit modifier
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
1 - Implicit parameters
2 ndash Implicit type conversion
3 ndash ldquoPimp my Libraryrdquo
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Implicit parameters
case class Context(data List[String]) implicit val context = Context(List(a b c))
object SomeService def printCtx(implicit ctx Context) = println(ctxdatamkString())
SomeServiceprintCtx abc
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Implicit type conversion
Compiler will use the implicit conversion method automatically
case class User(first String last String) def printUserInfo(user User) println(User name is + userfirst + last name is + userlast) implicit def stringToUser(userString String) User = val split = userStringsplit( ) User(split(0) split(1))
printUserInfo(Alexander Albul)
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Pimp My Library
case class User(first String last String)
implicit class ExtendedString(str String) def toUser User = val split = strsplit( ) User(split(0) split(1))
def printUserInfo(user User) println(User name is + userfirst +
last name is + userlast) printUserInfo(Alexander AlbultoUser)
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Moar SugarFor those who survived
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Object equality
Use == to compare anything
1 == 10 true
List(123) == List(123) true
null == List(123) false
List(12) == string false
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Object equality
The equality operator == do the following
1 Check the left side for null2 If left side is not null then call equals method
Scala provides a facility for comparing reference equality as well under the name eq However eq and its opposite ne only apply to objects that directly map to Java objects
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Packages and Imports
bull Scala code resides in the Java platformrsquos global hierarchy of packages
bull Package definition is at the top of the filebull The structure is reflected on file system
package graveyard class Zombie
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Packages and Imports
bull The other way you can place code into packages in Scala is more like C namespaces (called packaging)
bull Packages can be nested
package graveyard package gravestone class Zombie
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Packages and Imports
In Scala packages and their members can be imported using import clauses Imported items can then be accessed by a simple name like Zombie as opposed to requiring a qualified name like graveyardgravestoneZombie
import Zombie import graveyardgravestoneZombie
import all undead horde import graveyard_
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Packages and Imports
bull Imports may appear anywherebull Import may refer to objects (singleton or regular) in addition to packages bull Import let you rename and hide some of the imported members
please dont do this IRL aliases must be reasonable import graveyardgravestoneZombie =gt RoseBush
def hideUndead() RoseBush = import graveyardgravestoneZombie =gt OldMan new OldMan()
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Identifiers
1 CamelCase
2 Alphanumeric for variables ndash letters + digits
3 Do not use starting $ - it is reserved for compiler variables
4 Do not use _ in names ndash underscore has other usages
5 Constants has first uppercase letter ndash mathPi
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Method call
Method with 0 parameter can be called without ()Method with 1 parameter can be called using infix notation
new Test()method method call new Test()function res1 () =gt Unit = ltfunction0gt new Test() method1 10 13
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Method call
Use higher-order functions with infix notation but not with mixed notation
List(abcdzyxwvu)map (_toUpperCase)filter (_length gt 5) bad
List(abcdzyxwvu) map (_toUpperCase) filter (_length gt 5) good
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Method calls
Use infix notation only with methods without side effects
(which do not modify internal class state)
List(12) mkString ok
new CustomDataset() add some value not ok
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Lazy evaluation
An expression that has a value but that is not evaluated until its actually needed (in
another words ndash until the value is actually read)
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Call by-name parameter
Lazy evaluated parameter
def callByValue(x Int) = parameter get evaluated upon function call
println(x1= + x) println(x2= + x)
def callByName(x =gt Int) = println(x1= + x) parameter get evaluated here println(x2= + x) parameter get evaluated again
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Lazy initialization
When a val is declared with the lazy modifier the right-hand side of the value (the definition) will not be executed until the first time the
value is accessed
val normal = 5 evaluated immediately lazy val lzy = 5 evaluated only upon first read
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Streams
A stream is like a list except that its elements are computed lazily Because of this a stream can be infinitely long
Only those elements requested will be computed Otherwise streams have the same performance characteristics as lists
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Stuff Streams
Classical example Fibonacci sequence
def fibFrom(a Int b Int) Stream[Int] = a fibFrom(b a + b)
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Tail recursion
Scala compiler can transform a recursive call into a loop so that it wonrsquot use stack for evaluationBut it can apply its magic only in case of tail recursion
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Tail recursion
Tail recursion is simple
If the last evaluated expression in a function only makes a recursive call but does not make additional computations than the function is tail recursive
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Tail recursion example
def boom(x Int) Int = if (x == 0) throw new Exception(boom) else boom(x - 1) + 1
tailrec def bang(x Int) Int = if (x == 0) throw new Exception(bang) else bang(x - 1)
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Monads
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Monad
Monad is a name of abstraction
1 Chain function calls2 ldquoContainerrdquo type3 Composable with each other4 Wrap types which are stored in the monad
into a monad type (like zombies ndash their bites turn everyone in a zombie)
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Monad
You may have been working with monads already
bull Promises are monadsbull jQuery object is a monadbull Futures (partial monadic API)
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Monad
Every monad can
bull Wrap a value into a Monad type bull Unwrap a value from a Monad typebull Work transparently with wrapped value
using Monad interface
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Monads like Zombies
Every good zombie can
bull Turn a person into a zombie bull Turn back into a person if curedbull Communicate with other zombies as if
those were people
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Monads
Monad is a really tough topic for beginners
Spend at least a week cranking the theory to create you own vision of this abstraction
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Option
Scala has a standard type named Option for optional values One can say that Option is a replacement for Null-object pattern
It eliminates the null-checks in the codeIt eliminates Null-Pointer Exceptions
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Option
Option have two forms
bull Some(x)bull None
Scala collections do not return nulls they return None
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Option
The most common way to take optional values apart is through a pattern match
def show(x Option[String]) = x match case Some(s) =gt println(s) case None =gt println()
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Option
Option is a collection
Well it is actually a single-value container
You can use map filter flallen for-comprehension and other collection API methods with Option
httpdanielwestheidecomblog20121219the-neophytes-guide-to-scala-part-5-the-option-typehtml
httpblogtmorrisnetscalaoption-cheat-sheet
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Option Practices
bull You should avoid null as much as possible in Scala
bull Use Option when you can return something like a ldquono valuerdquo
bull Do not use null-checks in scala use collection APIpattern matching over Option
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Try
A monad for exception handling
Its main purpose is to wrap the exception and pass it around the code (eg to another execution context)
Was developed by Twitter team to pass exceptions across cluster nodes
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Try
Try has two forms
bull Failure[Throwable]bull Success[T]
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Try Example
Try(IntegerparseInt(3))getOrElse(println(Sorry I failed))
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Try Practices
bull Use Try rather than a catch block for handling unexpected failure
bull Use Try when working with Futurebull Exposing Try in a public API has a similiar
effect as a checked exception Consider using exceptions instead
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Underscore
Wildcard on steroids
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Underscore usages
Tons of them
1 ldquoPlaceholder syntaxrdquo
List(1 2 3) map (_ + 2)
2 Partially applied functionsList(1 2 3) foreach println _
3 Wildcard patternSome(5) match case Some(_) =gt println(Yes)
4 Wildcard importsimport javautil_
httpstackoverflowcomquestions8000903what-are-all-the-uses-of-an-underscore-in-scala
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Thanks
val you = new Developer[Any] with ScalaKnowledge
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
Resources
bull Scala Twitter School [link]
bull Effective Scala [link]
bull Scala for Java Programmers [link]
bull The Neophytersquos Guide to Scala [link] [book]
bull Functional Programming Principles in Scala Coursera [link]
bull Programming in Scala [book]
bull ScalaUA skype chat [link]
- Scala Intro
- Slide 2
- Slide 3
- Is Scala really hard
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Scala ndash scalable language
- Slide 10
- Slide 11
- Hello hellip
- Another Hello
- Slide 14
- Scala functional basics
- Slide 16
- Mutability is evil
- Mutability is evil (2)
- Everything returns data
- Functions are first-class citizens
- in Scala a function value is an object
- Sooo many objects around
- Slide 23
- Scala OOP basics
- Slide 25
- Class
- Class + Constructor
- Object
- Slide 29
- Companion Object
- Case Class
- Case Class Sugar
- Abstract class vs Trait
- Abstract Class
- Trait
- Scala Basic Types
- Slide 37
- Slide 38
- Operators are methods
- Class Hierarchy
- Slide 41
- Null
- Nothing
- Functions vs methods
- Slide 45
- Slide 46
- Functions
- Functions (2)
- Methods
- Methods (2)
- Functions are first-class citizens (2)
- Functions are first-class citizens (3)
- Functions are first-class citizens (4)
- Type Inference
- Slide 55
- Type inference with variables
- Type inference with functions
- Type inference
- Slide 59
- Lambda Syntax
- Closures
- Slide 62
- Simple Closure
- Closure vs Function
- Collections
- Slide 66
- Sugar Map Initialization
- Sugar Filtering
- Sugar Classification
- Stuff Tuples
- Stuff Tuples (2)
- Slide 72
- Mutable vs Immutable
- Slide 74
- Collections practices
- Collections API example 1
- Collections API example 2
- Loops amp For comprehension
- Loops amp For comprehension (2)
- Loops amp For comprehension (3)
- While loop
- Do-While loop
- Friendly advise
- For expression
- Slide 85
- For expression (2)
- For + generator
- For + generator + filter
- For + generator + filter + yield
- For expression (3)
- Pattern Matching
- Simple matching
- Structure matching
- Structure matching (2)
- Exception handling
- Implicits
- Implicits
- 1 - Implicit parameters 2 ndash Implicit type conversion 3 ndash ldquo
- Implicit parameters
- Implicit type conversion
- Pimp My Library
- Slide 102
- Moar Sugar For those who survived
- Slide 104
- Stuff Object equality
- Stuff Object equality (2)
- Stuff Packages and Imports
- Stuff Packages and Imports (2)
- Stuff Packages and Imports (3)
- Stuff Packages and Imports (4)
- Stuff Identifiers
- Stuff Method call
- Stuff Method call (2)
- Stuff Method calls
- Lazy evaluation
- Call by-name parameter
- Lazy initialization
- Stuff Streams
- Stuff Streams (2)
- Tail recursion
- Tail recursion (2)
- Tail recursion example
- Monads
- Slide 124
- Monad
- Monad (2)
- Monad (3)
- Monads like Zombies
- Monads (2)
- Option
- Option (2)
- Option (3)
- Option (4)
- Option Practices
- Try
- Try (2)
- Try Example
- Try Practices
- Underscore
- Underscore usages
- Thanks
- Slide 142
-
top related