SlideShare a Scribd company logo
1 of 56
A Brief Intro to Scala Tim Underwood
About Me Tim Underwood Co-Founder of Frugal Mechanic Software Developer Perl, PHP, C, C++, C#, Java, Ruby and now Scala Before Scaladefault languages were Ruby and Java
Dynamic vs. Static Dynamic (Ruby) Static (Java) Concise Scriptable Read-Eval-Print Loop (irb) Higher Order Functions Extend existing classes Duck Typing method_missing Better IDE Support Fewer Tests Documentation Open Source Libs Performance JVM Tools (VisualVM) True Multi-threading
Scala ,[object Object]
Scriptable
Read-Eval-Print Loop
Higher Order Functions
Extend existing classes
Duck Typing
method_missing
Better IDE Support
Fewer Tests
Documentation
Open Source Libs
Performance
JVM Tools (VisualVM)
True Multi-threading,[object Object]
Scalais a modern multi-paradigm programming language designed to express common programming patterns in a concise, elegant, and type-safe way.
Scala Statically Typed Runs on JVM, full inter-op with Java Object Oriented Functional Dynamic Features
Scala is Practical Can be used as drop-in replacement for Java Mixed Scala/Java projects Use existing Java libraries Use existing Java tools (Ant, Maven, JUnit, etc…) Decent IDE Support (NetBeans, IntelliJ, Eclipse)
Scala is Concise
Type Inference val sum = 1 + 2 + 3 valnums = List(1, 2, 3) val map = Map("abc" -> List(1,2,3))
Explicit Types val sum:Int= 1 + 2 + 3 valnums:List[Int]= List(1, 2, 3) val map:Map[String, List[Int]] = ...
Higher Level // Java – Check if string has uppercase character booleanhasUpperCase = false; for(inti = 0; i < name.length(); i++) { if(Character.isUpperCase(name.charAt(i))) { hasUpperCase = true; break;     } }
Higher Level // Scala valhasUpperCase = name.exists(_.isUpperCase)
Less Boilerplate // Java public class Person { private String name; private intage; public Person(String name, Intage) {  // constructor     this.name = name; this.age = age;   } public String getName() {              // name getter     return name;   } publicintgetAge() {                  // age getter     return age;   } public void setName(Stringname) {     // name setter     this.name = name;   } public void setAge(intage) {          // age setter this.age = age;   } }
Less Boilerplate // Scala class Person(varname: String, varage: Int)
Less Boilerplate // Scala class Person(var name: String, privatevar _age: Int) {   defage = _age// Getter for age   defage_=(newAge:Int) {  // Setter for age println("Changing age to: "+newAge) _age = newAge   } }
Variables and Values // variable varfoo = "foo" foo = "bar"  // okay // value valbar = "bar" bar = "foo"// nope
Scala is Object Oriented
Pure O.O. // Every value is an object 1.toString // Every operation is a method call 1 + 2 + 3    (1).+(2).+(3) // Can omit . and ( ) "abc" charAt 1    "abc".charAt(1)
Classes // Classes (and abstract classes) like Java abstract classLanguage(valname:String) { override deftoString = name } // Example implementations classScalaextendsLanguage("Scala") // Anonymous class valscala = newLanguage("Scala") { /* empty */ }
Traits // Like interfaces in Java trait Language { valname:String // But allow implementation overridedeftoString = name }
Traits traitJVM {    override deftoString = super.toString+" runs on JVM" } traitStatic {   override deftoString = super.toString+" is Static" } // Traits are stackable classScalaextends Language with JVM with Static { val name = "Scala" } println(newScala) "Scala runs on JVM is Static"
Singleton Objects // Replaces static methods from Java // Can extend/implement classes & traits object Hello {   def world = println("Hello World"} } Hello.world  Hello World
Scala is Functional
First Class Functions // Lightweight anonymous functions (x:Int) => x + 1 // Calling the anonymous function valplusOne = (x:Int) => x + 1 plusOne(5)    6
Closures // plusFoo can reference any values/variables in scope varfoo= 1 valplusFoo = (x:Int) => x + foo plusFoo(5)      6 // Changing foo changes the return value of plusFoo foo= 5 plusFoo(5)      10
Higher Order Functions valplusOne = (x:Int) => x + 1 valnums = List(1,2,3) // map takes a function: Int => T nums.map(plusOne)       List(2,3,4) // Inline Anonymous nums.map(x => x + 1)    List(2,3,4) // Short form nums.map(_ + 1)         List(2,3,4)
Higher Order Functions valnums = List(1,2,3,4) // A few more examples for List class nums.exists(_ == 2)          true nums.find(_ == 2)            Some(2) nums.indexWhere(_ == 2)      1 nums.reduceLeft(_ + _)       10 nums.foldLeft(100)(_ + _)    110 // Many more in collections library
Higher Order Functions // functions as parameters defcall(f: Int => Int) = f(1) call(plusOne)       2 call(x => x + 1)    2 call(_ + 1)         2
Higher Order Functions // functions as parameters defeach(xs: List[Int], fun: Int => Unit) { if(!xs.isEmpty) { fun(xs.head) each(xs.tail, fun)   } } each(List(1,2,3), println)   1   2   3
Higher Order Functions // More complex example with generics & patternmatching @tailrec defeach[T](xs: List[T], fun: T => Unit): Unit = xsmatch{ caseNil => casehead :: tail => fun(head); each(tail, fun) } each(List(1,2), println)   1   2 each(List("foo", "bar"), println) foo   bar
Pattern Matching def what(any:Any) = any match { casei:Int => "It's an Int" cases:String => "It's a String" case_ => "I don't know what it is" } what(123)       "It's an Int" what("hello")   "It's a String" what(false)     "I don't know what it is"
Pattern Matching valnums = List(1,2,3) // Pattern matching to create 3 vals valList(a,b,c) = nums a      1 b  2 c  3
Immutable Types // Immutable types by default varnums = Set(1,2,3) nums+= 4  nums= nums.+(4) // Mutable types available importscala.collection.mutable._ valnums = Set(1,2,3) nums+= 4  nums.+=(4)
scala.collection
scala.collection.immutable
scala.collection.mutable
Or Use Existing Java Collections java.util Apache Commons Collections fastutil Trove Google Collections scala.collection.JavaConversion available to convert to and from java.util Interfaces
Scalais Dynamic (Okay not really, but it has lots of features typically only found in Dynamic languages)
Scriptable // HelloWorld.scala println("Hello World") bash$scalaHelloWorld.scala Hello World bash$scala -e 'println("Hello World")' Hello World
Read-Eval-Print Loop bash$scala Welcome to Scala version 2.8.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22). Type in expressions to have them evaluated. Type :help for more information. scala>class Foo { def bar = "baz" } defined class Foo scala>valf = new Foo f: Foo = Foo@51707653 scala> f.bar res2: java.lang.String = baz
Structural Typing // Type safe Duck Typing def doTalk(any:{deftalk:String}) { println(any.talk) } class Duck { def talk = "Quack" } class Dog  { def talk = "Bark"  } doTalk(new Duck)    "Quack" doTalk(new Dog)     "Bark"
Implicit Conversions // Extend existing classes in a type safe way // Goal: Add isBlank method to String class classRichString(s:String) {    defisBlank = null == s || "" == s.trim } implicit deftoRichString(s:String) = newRichString(s) // Our isBlank method is now available on Strings " ".isBlanktrue "foo".isBlankfalse
Implicit Conversions // Does not type check "abc".isBlank // Search in-scope implicitsdefs that take a // String & return a type with an isBlank method implicit deftoRichString(s:String):RichString // Resulting code that type checks newRichString("abc").isBlank

More Related Content

What's hot

The Kotlin Programming Language
The Kotlin Programming LanguageThe Kotlin Programming Language
The Kotlin Programming Language
intelliyole
 

What's hot (20)

Joy of scala
Joy of scalaJoy of scala
Joy of scala
 
The Kotlin Programming Language
The Kotlin Programming LanguageThe Kotlin Programming Language
The Kotlin Programming Language
 
Introduction to kotlin
Introduction to kotlinIntroduction to kotlin
Introduction to kotlin
 
Introduction to Swift programming language.
Introduction to Swift programming language.Introduction to Swift programming language.
Introduction to Swift programming language.
 
Java - Generic programming
Java - Generic programmingJava - Generic programming
Java - Generic programming
 
07. Virtual Functions
07. Virtual Functions07. Virtual Functions
07. Virtual Functions
 
Groovy Programming Language
Groovy Programming LanguageGroovy Programming Language
Groovy Programming Language
 
Introduction to Koltin for Android Part I
Introduction to Koltin for Android Part I Introduction to Koltin for Android Part I
Introduction to Koltin for Android Part I
 
Java Collections Framework
Java Collections FrameworkJava Collections Framework
Java Collections Framework
 
Kotlin for Android Development
Kotlin for Android DevelopmentKotlin for Android Development
Kotlin for Android Development
 
Introduction to java
Introduction to javaIntroduction to java
Introduction to java
 
Java modules
Java modulesJava modules
Java modules
 
Java String
Java StringJava String
Java String
 
Introduction to Kotlin Language and its application to Android platform
Introduction to Kotlin Language and its application to Android platformIntroduction to Kotlin Language and its application to Android platform
Introduction to Kotlin Language and its application to Android platform
 
Node.js Express
Node.js  ExpressNode.js  Express
Node.js Express
 
Basic Concepts of OOPs (Object Oriented Programming in Java)
Basic Concepts of OOPs (Object Oriented Programming in Java)Basic Concepts of OOPs (Object Oriented Programming in Java)
Basic Concepts of OOPs (Object Oriented Programming in Java)
 
Java 8 Lambda Built-in Functional Interfaces
Java 8 Lambda Built-in Functional InterfacesJava 8 Lambda Built-in Functional Interfaces
Java 8 Lambda Built-in Functional Interfaces
 
Swift Programming Language
Swift Programming LanguageSwift Programming Language
Swift Programming Language
 
Java Tutorial | Java Programming Tutorial | Java Basics | Java Training | Edu...
Java Tutorial | Java Programming Tutorial | Java Basics | Java Training | Edu...Java Tutorial | Java Programming Tutorial | Java Basics | Java Training | Edu...
Java Tutorial | Java Programming Tutorial | Java Basics | Java Training | Edu...
 
String in java
String in javaString in java
String in java
 

Viewers also liked

Viewers also liked (9)

Scala, just a better java?
Scala, just a better java?Scala, just a better java?
Scala, just a better java?
 
Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009
 
Apache Spark MLlib - Random Foreset and Desicion Trees
Apache Spark MLlib - Random Foreset and Desicion TreesApache Spark MLlib - Random Foreset and Desicion Trees
Apache Spark MLlib - Random Foreset and Desicion Trees
 
Apache spark Intro
Apache spark IntroApache spark Intro
Apache spark Intro
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
Scala and spark
Scala and sparkScala and spark
Scala and spark
 
Spark workshop
Spark workshopSpark workshop
Spark workshop
 
Spark Dataframe - Mr. Jyotiska
Spark Dataframe - Mr. JyotiskaSpark Dataframe - Mr. Jyotiska
Spark Dataframe - Mr. Jyotiska
 
Build a deep learning pipeline on apache spark for ads optimization
Build a deep learning pipeline on apache spark for ads optimizationBuild a deep learning pipeline on apache spark for ads optimization
Build a deep learning pipeline on apache spark for ads optimization
 

Similar to A Brief Intro to Scala

Intro to scala
Intro to scalaIntro to scala
Intro to scala
Joe Zulli
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?
Tomasz Wrobel
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar Prokopec
Loïc Descotte
 

Similar to A Brief Intro to Scala (20)

Intro to scala
Intro to scalaIntro to scala
Intro to scala
 
Scala in Places API
Scala in Places APIScala in Places API
Scala in Places API
 
Scala for curious
Scala for curiousScala for curious
Scala for curious
 
Scala in a nutshell by venkat
Scala in a nutshell by venkatScala in a nutshell by venkat
Scala in a nutshell by venkat
 
Scala introduction
Scala introductionScala introduction
Scala introduction
 
Softshake 2013: 10 reasons why java developers are jealous of Scala developers
Softshake 2013: 10 reasons why java developers are jealous of Scala developersSoftshake 2013: 10 reasons why java developers are jealous of Scala developers
Softshake 2013: 10 reasons why java developers are jealous of Scala developers
 
Scala ntnu
Scala ntnuScala ntnu
Scala ntnu
 
Beginning Scala Svcc 2009
Beginning Scala Svcc 2009Beginning Scala Svcc 2009
Beginning Scala Svcc 2009
 
Scala
ScalaScala
Scala
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?
 
ES6 and BEYOND
ES6 and BEYONDES6 and BEYOND
ES6 and BEYOND
 
Scala collections api expressivity and brevity upgrade from java
Scala collections api  expressivity and brevity upgrade from javaScala collections api  expressivity and brevity upgrade from java
Scala collections api expressivity and brevity upgrade from java
 
Scala uma poderosa linguagem para a jvm
Scala   uma poderosa linguagem para a jvmScala   uma poderosa linguagem para a jvm
Scala uma poderosa linguagem para a jvm
 
Workshop Scala
Workshop ScalaWorkshop Scala
Workshop Scala
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar Prokopec
 
The Great Scala Makeover
The Great Scala MakeoverThe Great Scala Makeover
The Great Scala Makeover
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
Scala introduction
Scala introductionScala introduction
Scala introduction
 
Game Design and Development Workshop Day 1
Game Design and Development Workshop Day 1Game Design and Development Workshop Day 1
Game Design and Development Workshop Day 1
 

Recently uploaded

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Recently uploaded (20)

A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 

A Brief Intro to Scala

  • 1. A Brief Intro to Scala Tim Underwood
  • 2. About Me Tim Underwood Co-Founder of Frugal Mechanic Software Developer Perl, PHP, C, C++, C#, Java, Ruby and now Scala Before Scaladefault languages were Ruby and Java
  • 3. Dynamic vs. Static Dynamic (Ruby) Static (Java) Concise Scriptable Read-Eval-Print Loop (irb) Higher Order Functions Extend existing classes Duck Typing method_missing Better IDE Support Fewer Tests Documentation Open Source Libs Performance JVM Tools (VisualVM) True Multi-threading
  • 4.
  • 17.
  • 18. Scalais a modern multi-paradigm programming language designed to express common programming patterns in a concise, elegant, and type-safe way.
  • 19. Scala Statically Typed Runs on JVM, full inter-op with Java Object Oriented Functional Dynamic Features
  • 20. Scala is Practical Can be used as drop-in replacement for Java Mixed Scala/Java projects Use existing Java libraries Use existing Java tools (Ant, Maven, JUnit, etc…) Decent IDE Support (NetBeans, IntelliJ, Eclipse)
  • 22. Type Inference val sum = 1 + 2 + 3 valnums = List(1, 2, 3) val map = Map("abc" -> List(1,2,3))
  • 23. Explicit Types val sum:Int= 1 + 2 + 3 valnums:List[Int]= List(1, 2, 3) val map:Map[String, List[Int]] = ...
  • 24. Higher Level // Java – Check if string has uppercase character booleanhasUpperCase = false; for(inti = 0; i < name.length(); i++) { if(Character.isUpperCase(name.charAt(i))) { hasUpperCase = true; break; } }
  • 25. Higher Level // Scala valhasUpperCase = name.exists(_.isUpperCase)
  • 26. Less Boilerplate // Java public class Person { private String name; private intage; public Person(String name, Intage) { // constructor this.name = name; this.age = age; } public String getName() { // name getter return name; } publicintgetAge() { // age getter return age; } public void setName(Stringname) { // name setter this.name = name; } public void setAge(intage) { // age setter this.age = age; } }
  • 27. Less Boilerplate // Scala class Person(varname: String, varage: Int)
  • 28. Less Boilerplate // Scala class Person(var name: String, privatevar _age: Int) { defage = _age// Getter for age defage_=(newAge:Int) { // Setter for age println("Changing age to: "+newAge) _age = newAge } }
  • 29. Variables and Values // variable varfoo = "foo" foo = "bar" // okay // value valbar = "bar" bar = "foo"// nope
  • 30. Scala is Object Oriented
  • 31. Pure O.O. // Every value is an object 1.toString // Every operation is a method call 1 + 2 + 3  (1).+(2).+(3) // Can omit . and ( ) "abc" charAt 1  "abc".charAt(1)
  • 32. Classes // Classes (and abstract classes) like Java abstract classLanguage(valname:String) { override deftoString = name } // Example implementations classScalaextendsLanguage("Scala") // Anonymous class valscala = newLanguage("Scala") { /* empty */ }
  • 33. Traits // Like interfaces in Java trait Language { valname:String // But allow implementation overridedeftoString = name }
  • 34. Traits traitJVM { override deftoString = super.toString+" runs on JVM" } traitStatic { override deftoString = super.toString+" is Static" } // Traits are stackable classScalaextends Language with JVM with Static { val name = "Scala" } println(newScala) "Scala runs on JVM is Static"
  • 35. Singleton Objects // Replaces static methods from Java // Can extend/implement classes & traits object Hello { def world = println("Hello World"} } Hello.world Hello World
  • 37. First Class Functions // Lightweight anonymous functions (x:Int) => x + 1 // Calling the anonymous function valplusOne = (x:Int) => x + 1 plusOne(5)  6
  • 38. Closures // plusFoo can reference any values/variables in scope varfoo= 1 valplusFoo = (x:Int) => x + foo plusFoo(5)  6 // Changing foo changes the return value of plusFoo foo= 5 plusFoo(5)  10
  • 39. Higher Order Functions valplusOne = (x:Int) => x + 1 valnums = List(1,2,3) // map takes a function: Int => T nums.map(plusOne)  List(2,3,4) // Inline Anonymous nums.map(x => x + 1)  List(2,3,4) // Short form nums.map(_ + 1)  List(2,3,4)
  • 40. Higher Order Functions valnums = List(1,2,3,4) // A few more examples for List class nums.exists(_ == 2)  true nums.find(_ == 2)  Some(2) nums.indexWhere(_ == 2)  1 nums.reduceLeft(_ + _)  10 nums.foldLeft(100)(_ + _)  110 // Many more in collections library
  • 41. Higher Order Functions // functions as parameters defcall(f: Int => Int) = f(1) call(plusOne)  2 call(x => x + 1)  2 call(_ + 1)  2
  • 42. Higher Order Functions // functions as parameters defeach(xs: List[Int], fun: Int => Unit) { if(!xs.isEmpty) { fun(xs.head) each(xs.tail, fun) } } each(List(1,2,3), println)  1  2  3
  • 43. Higher Order Functions // More complex example with generics & patternmatching @tailrec defeach[T](xs: List[T], fun: T => Unit): Unit = xsmatch{ caseNil => casehead :: tail => fun(head); each(tail, fun) } each(List(1,2), println)  1  2 each(List("foo", "bar"), println) foo  bar
  • 44. Pattern Matching def what(any:Any) = any match { casei:Int => "It's an Int" cases:String => "It's a String" case_ => "I don't know what it is" } what(123)  "It's an Int" what("hello")  "It's a String" what(false)  "I don't know what it is"
  • 45. Pattern Matching valnums = List(1,2,3) // Pattern matching to create 3 vals valList(a,b,c) = nums a  1 b 2 c 3
  • 46. Immutable Types // Immutable types by default varnums = Set(1,2,3) nums+= 4 nums= nums.+(4) // Mutable types available importscala.collection.mutable._ valnums = Set(1,2,3) nums+= 4 nums.+=(4)
  • 50. Or Use Existing Java Collections java.util Apache Commons Collections fastutil Trove Google Collections scala.collection.JavaConversion available to convert to and from java.util Interfaces
  • 51. Scalais Dynamic (Okay not really, but it has lots of features typically only found in Dynamic languages)
  • 52. Scriptable // HelloWorld.scala println("Hello World") bash$scalaHelloWorld.scala Hello World bash$scala -e 'println("Hello World")' Hello World
  • 53. Read-Eval-Print Loop bash$scala Welcome to Scala version 2.8.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22). Type in expressions to have them evaluated. Type :help for more information. scala>class Foo { def bar = "baz" } defined class Foo scala>valf = new Foo f: Foo = Foo@51707653 scala> f.bar res2: java.lang.String = baz
  • 54. Structural Typing // Type safe Duck Typing def doTalk(any:{deftalk:String}) { println(any.talk) } class Duck { def talk = "Quack" } class Dog { def talk = "Bark" } doTalk(new Duck)  "Quack" doTalk(new Dog)  "Bark"
  • 55. Implicit Conversions // Extend existing classes in a type safe way // Goal: Add isBlank method to String class classRichString(s:String) { defisBlank = null == s || "" == s.trim } implicit deftoRichString(s:String) = newRichString(s) // Our isBlank method is now available on Strings " ".isBlanktrue "foo".isBlankfalse
  • 56. Implicit Conversions // Does not type check "abc".isBlank // Search in-scope implicitsdefs that take a // String & return a type with an isBlank method implicit deftoRichString(s:String):RichString // Resulting code that type checks newRichString("abc").isBlank
  • 57. method_missing(Scala 2.9 Feature) // Dynamic is a marker trait used by the compiler classFooextendsDynamic { deftyped[T] = error("not implemented") defapplyDynamic(name:String)(args:Any*) = { println("called: "+name+"("+args.mkString(",")+")") } } valf = newFoo f.helloWorld called: helloWorld() f.hello("world") called: hello(world) f.bar(1,2,3) called: bar(1,2,3)
  • 58. Scala has tons of other cool stuff
  • 59. Default Parameter Values defhello(foo:Int= 0, bar:Int= 0) { println("foo: "+foo+" bar: "+bar) } hello()foo: 0 bar: 0 hello(1)foo: 1 bar: 0 hello(1,2)foo: 1 bar: 2
  • 60. Named Parameters defhello(foo:Int = 0, bar:Int = 0) { println("foo: "+foo+" bar: "+bar) } hello(bar=6) foo: 0 bar: 6 hello(foo=7) foo: 7 bar: 0 hello(foo=8,bar=9) foo: 8 bar: 9
  • 61. Everything Returns a Value val a = if(true) "yes" else "no" valb =try{ "foo" } catch { case _ => "error" } valc = { println("hello") "foo" }
  • 62. Lazy Vals // initialized on first access lazyvalfoo = { println("init") "bar" } foo init foo foo
  • 63. Nested Functions // Can nest multiple levels of functions def outer() { varmsg = "foo" def one() { def two() { def three() { println(msg) } three() } two() } one() }
  • 64. By-Name Parameters // msg parameter automatically wrapped in closure deflog(doLog:Boolean, msg: => String) { if(doLog) { msg// evaluates msg msg// evaluates msg again! } } deffoo:String = { println("infoo"); "Foo" } log(true, foo+" Bar") // foo called twice  in foo  in foo log(false, foo+" Bar") // foo never called
  • 65. Many More Features Actors Annotations @foo def hello = "world" Case Classes case class Foo(bar:String) Curryingdef foo(a:Int,b:Boolean)(c:String) For Comprehensions for(i <- 1.to(5) if i % 2 == 0) yield i Genericsclass Foo[T](bar:T) Package Objects Partially Applied Functions Tuplesvalt = (1,"foo","bar") Type Specialization XML Literals val node = <hello>world</hello> etc…
  • 66. Personal Experiences Productive from Day 1 Drop in replacement for Java giving you more Ruby-like syntax and features Can pickup the functional and higher-level programming concepts as you go
  • 67. Great Book for a Deep Dive into Scala