SlideShare a Scribd company logo
1 of 56
Scala for Java Developers © 2011 SpringOne 2GX. All rights reserved. Do not distribute without permission.
What is Scala “ a  general purpose  programming language designed to express common programming patterns in a  concise ,  elegant , and  type-safe  way. It smoothly integrates features of  object-oriented  and  functional  languages, enabling Java and other programmers to be more  productive .” http://www.scala-lang.org
Object-oriented ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Statically typed ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Functional Programming ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Java Interoperability ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Hello World: Scripting Style $ scala hello-script.scala Hello World No compilation
Hello World: Porting of Java Code $ scalac hello-java.scala $ scala example.Main Hello World ‘ static’ Inferred semicolons
Hello World: Using the App trait $ scalac hello-app.scala $ scala example.Main Hello World
Simple Class class  Person val  p =  new  Person Type Inferred Default access: public No curly braces needed (but allowed)
Simple Class class  Person val  p: Person =  new  Person Explicit type specification
Class with constructor class  Person(firstName: String,  lastName: String) val  p =  new  Person( "Ramnivas" ,  "Laddad" ) println(p.firstName) // Error Primary constructor Fields – accessible in class body
Class with “getters” class  Person( val  firstName: String,  val  lastName: String) val  p =  new  Person( "Ramnivas" ,  "Laddad" ) println(p.firstName) Value  (Java ‘final’)
Class with “getters” and “setters” class  Person( var  firstName: String,  var  lastName: String) val  p =  new  Person( "Ramnivas" ,  "Laddad" ) println(p.firstName) p.firstName =  "Ramnivas2” Variable (Java non-final)
Extending a class val  s =  new  Student( "Ramnivas" ,  "Laddad" , 1) println(s.firstName) println(s.grade)
Defining methods class  Person( val  firstName: String,  val  lastName: String) { def  name = firstName +  " "  + lastName override   def  toString = name  } val  p =  new  Person( "Ramnivas" ,  "Laddad" ) println(p.name)  // Ramnivas Laddad println(p)  // Ramnivas Laddad Not optional
Uniform access principle class  Person( val  firstName: String,  val  lastName: String) { val   name = firstName +  " "  + lastName override   def  toString = name  } val  p =  new  Person( "Ramnivas" ,  "Laddad" ) println(p.name)  // Ramnivas Laddad println(p)  // Ramnivas Laddad
Names in Scala ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
More about methods and fields ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Finer access control levels ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Traits: Interfaces done right trait  PartyGoer { val  age: Int val  yearsUntilLegalDrinking =  if  (age >= 18) 0  else  18-age }
Collections val  people = List( "John" ,  "Jacob" ,  "Mike" )
Collections val  people = Array( "John" ,  "Jacob" ,  "Mike" )
Working with collections: for comprehension for  (person <- people) { println(person) }
Working with collections: for comprehension for  (person <- people  if  person startsWith  &quot;J&quot; ) { println( &quot;&quot;&quot;Lucky one to start name in &quot;J&quot; &quot;&quot;&quot;  + person) } // You are lucky one to start name in &quot;J&quot; John // You are lucky one to start name in &quot;J&quot;  Jacob
Working with collections: filter val  student1 =  new  Student( &quot;first1&quot; ,  &quot;last1&quot; , 1) val  student2 =  new  Student( &quot;first2&quot; ,  &quot;last2&quot; , 1) val  student3 =  new  Student( &quot;first3&quot; ,  &quot;last3&quot; , 2) val  student4 =  new  Student( &quot;first4&quot; ,  &quot;last4&quot; , 6) val  students = List(student1, student2,  student3, student4)
Working with collections: filter val  student1 =  new  Student( &quot;first1&quot; ,  &quot;last1&quot; , 1) val  student2 =  new  Student( &quot;first2&quot; ,  &quot;last2&quot; , 1) val  student3 =  new  Student( &quot;first3&quot; ,  &quot;last3&quot; , 2) val  student4 =  new  Student( &quot;first4&quot; ,  &quot;last4&quot; , 6) val  students = List(student1, student2,  student3, student4)
Working with collections: using _ val  student1 =  new  Student( &quot;first1&quot; ,  &quot;last1&quot; , 1) val  student2 =  new  Student( &quot;first2&quot; ,  &quot;last2&quot; , 1) val  student3 =  new  Student( &quot;first3&quot; ,  &quot;last3&quot; , 2) val  student4 =  new  Student( &quot;first4&quot; ,  &quot;last4&quot; , 6) val  students = List(student1, student2,  student3, student4)
Working with collections: passing method as function val  student1 =  new  Student( &quot;first1&quot; ,  &quot;last1&quot; , 1) val  student2 =  new  Student( &quot;first2&quot; ,  &quot;last2&quot; , 1) val  student3 =  new  Student( &quot;first3&quot; ,  &quot;last3&quot; , 2) val  student4 =  new  Student( &quot;first4&quot; ,  &quot;last4&quot; , 6) val  students = List(student1, student2,  student3, student4)
Working with collections: partition val  student1 =  new  Student( &quot;first1&quot; ,  &quot;last1&quot; , 1) val  student2 =  new  Student( &quot;first2&quot; ,  &quot;last2&quot; , 1) val  student3 =  new  Student( &quot;first3&quot; ,  &quot;last3&quot; , 2) val  student4 =  new  Student( &quot;first4&quot; ,  &quot;last4&quot; , 6) val  students = List(student1, student2,  student3, student4) val  (elementarySchoolers, middleSchoolers)  =  students .partition(_.grade < 6) println( elementarySchoolers ) println( middleSchoolers ) //List(first1 last1, first2 last2, first3 last3) //List(first4 last4) Tuple
Working with collections: transforming val  student1 =  new  Student( &quot;first1&quot; ,  &quot;last1&quot; , 1) val  student2 =  new  Student( &quot;first2&quot; ,  &quot;last2&quot; , 1) val  student3 =  new  Student( &quot;first3&quot; ,  &quot;last3&quot; , 2) val  student4 =  new  Student( &quot;first4&quot; ,  &quot;last4&quot; , 6) val  students = List(student1, student2,  student3, student4)
Map println(studentSchools(student1))  // Miller
More collections ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Putting it together: Quicksort def  quicksort[T](input: Traversable[T]) (ordering: Ordering[T]) : Traversable[T] =  if  (input.isEmpty) { input }  else  { val  (low, high)  = input.tail.partition(ordering.lt(_, input.head)) quicksort(low)(ordering) ++ List(input.head)  ++ quicksort(high)(ordering) } println(quicksort(List(1, 3, 4, 5, 1))(Ordering.Int))
Putting it together: Quicksort println(quicksort(List(1, 3, 4, 5, 1)))
Pattern matching: Basics val  a:Any =  &quot;foo&quot; a  match  { case  str: String => println( &quot;A string: &quot;  + str) case  i: Int => println( &quot;An int: &quot;  + i) case  _ => println( &quot;Something else&quot; ) }
Pattern matching: with collections val  l = List( &quot;a&quot; ,  &quot;b&quot; ,  &quot;c&quot; ) l  match  { case  Nil => println( &quot;Empty!&quot; ) case  head :: Nil =>  println( &quot;Only one item &quot;  + head) case  head :: tail =>  println( &quot;Item &quot;  + head +  &quot; followed by &quot;  + tail) }
Quicksort with pattern matching def  quicksort[T](input: Traversable[T]) ( implicit  ordering: Ordering[T]) : Traversable[T] =  input  match  { case  head :: tail =>  val  (low, high) = tail.partition(ordering.lt(_, head)) quicksort(low) ++ List(head) ++ quicksort(high) case  _ => input } println(quicksort(List(1, 3, 4, 5, 1)))
Destutter using Pattern matching def  destutter[A](lst: List[A]): List[A] = lst  match  { case  h1 :: h2 :: tail  if  (h1 == h2)  => destutter(h2 :: tail) case  h1 :: h2 :: tail  => h1 :: destutter(h2 :: tail) case  _  => lst } // destutter(List(1,1,1,1,1,1)) => List(1) // destutter(List(1,1,4,3,3,2)) => List(1,4,3,2) // destutter(List() )=> List()
Case classes ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Case classes case   class  Human(name: String) case   class  SuperHero(name: String, power: String) val  characters = List(Human( &quot;Programmer&quot; ),  SuperHero( &quot;Customer&quot; ,  &quot;money&quot; ),  SuperHero( &quot;QA&quot; ,  &quot;testing&quot; ))
Case classes and pattern matching val  actions =  for  (character <- characters)  yield  character  match  { case  Human(name) =>  name +  &quot; needs to be saved&quot; case  SuperHero(name, power) =>  name +  &quot; will save using &quot;  + power } actions.foreach(println)
Pattern matching and extracting just enough val  actions =  for  (character <- characters)  yield  character  match  { case  Human(name) =>  name +  &quot; needs to be saved&quot; case  SuperHero(_, power) =>  &quot;Could be saved using &quot;  + power } actions.foreach(println) // Programmer needs to be saved // Could be saved using money // Could be saved using testing
Regular expressions val  text =  &quot;Ramnivas Laddad&quot;   val  Name =  &quot;&quot;&quot;(+)+(+)&quot;&quot;&quot; .r val  person = text  match  { case  Name(first, last) =>  Some( new  Person(first, last)) case  _ =>  None } println(person)  // Some(Ramnivas Laddad)
Options val  texts =  List( &quot;Ramnivas Laddad&quot; ,  &quot;foo&quot; ,  &quot;Scott Andrews&quot; ) val  peopleOptions = texts.map { _  match  { case  Name(first, last) =>  Some( new  Person(first, last)) case  _ => None } } println(peopleOptions) // List(Some(Ramnivas Laddad),  None,  Some(Scott Andrews))
Options: flattening val  texts =  List( &quot;Ramnivas Laddad&quot; ,  &quot;foo&quot; ,  &quot;Scott Andrews&quot; ) val  peopleOptions = texts.map { _  match  { case  Name(first, last) =>  Some( new  Person(first, last)) case  _ => None } } println(peopleOptions.flatten) // List(Ramnivas Laddad, Scott Andrews)
Options: flatMap val  texts =  List( &quot;Ramnivas Laddad&quot; ,  &quot;foo&quot; ,  &quot;Scott Andrews&quot; ) val  people = texts.flatMap { _  match  { case  Name(first, last) =>  Some( new  Person(first, last)) case  _ => None } } println(people) // List(Ramnivas Laddad, Scott Andrews)
Higher order functions def  process() : Unit = { retry(5)  { ... } } def  retry[T](maxRetry: Int)(thunk: => T) = { def  retry(thunk: => T, attempt: Int): T = { try  { thunk }  catch  { case  ex  if  (attempt < maxRetry) => retry(thunk, attempt + 1) } } retry(thunk, 0) } Thunk
Caching using Scala  ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Caching higher-order function ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Transaction management ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Transaction management function ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Transaction management implementation ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
There is more… a lot more ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Learning Scala ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Be ready to be humbled
Scala for Java Developers © 2011 SpringOne 2GX. All rights reserved. Do not distribute without permission.

More Related Content

What's hot

Scripting3
Scripting3Scripting3
Scripting3Nao Dara
 
16 Java Regex
16 Java Regex16 Java Regex
16 Java Regexwayn
 
From android/java to swift (1)
From android/java to swift (1)From android/java to swift (1)
From android/java to swift (1)allanh0526
 
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 jvmIsaias Barroso
 
Regular Expression
Regular ExpressionRegular Expression
Regular ExpressionBharat17485
 
Java: Regular Expression
Java: Regular ExpressionJava: Regular Expression
Java: Regular ExpressionMasudul Haque
 
42.type: Literal-based Singleton types
42.type: Literal-based Singleton types42.type: Literal-based Singleton types
42.type: Literal-based Singleton typesGeorge Leontiev
 
Marc’s (bio)perl course
Marc’s (bio)perl courseMarc’s (bio)perl course
Marc’s (bio)perl courseMarc Logghe
 
JavaScript - Chapter 4 - Types and Statements
 JavaScript - Chapter 4 - Types and Statements JavaScript - Chapter 4 - Types and Statements
JavaScript - Chapter 4 - Types and StatementsWebStackAcademy
 
Php basics
Php basicsPhp basics
Php basicshamfu
 
Functional programming with F#
Functional programming with F#Functional programming with F#
Functional programming with F#Remik Koczapski
 
Types and perl language
Types and perl languageTypes and perl language
Types and perl languageMasahiro Honma
 
Scala Demystifying the Funky Stuff
Scala Demystifying the Funky StuffScala Demystifying the Funky Stuff
Scala Demystifying the Funky StuffDan Hinojosa
 
Introduction To Scala
Introduction To ScalaIntroduction To Scala
Introduction To ScalaPeter Maas
 
PHP Strings and Patterns
PHP Strings and PatternsPHP Strings and Patterns
PHP Strings and PatternsHenry Osborne
 
String variable in php
String variable in phpString variable in php
String variable in phpchantholnet
 
Bioinformatica: Esercizi su Perl, espressioni regolari e altre amenità (BMR G...
Bioinformatica: Esercizi su Perl, espressioni regolari e altre amenità (BMR G...Bioinformatica: Esercizi su Perl, espressioni regolari e altre amenità (BMR G...
Bioinformatica: Esercizi su Perl, espressioni regolari e altre amenità (BMR G...Andrea Telatin
 

What's hot (20)

Scripting3
Scripting3Scripting3
Scripting3
 
16 Java Regex
16 Java Regex16 Java Regex
16 Java Regex
 
Intermediate JavaScript
Intermediate JavaScriptIntermediate JavaScript
Intermediate JavaScript
 
From android/java to swift (1)
From android/java to swift (1)From android/java to swift (1)
From android/java to swift (1)
 
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
 
Introduction to Swift 2
Introduction to Swift 2Introduction to Swift 2
Introduction to Swift 2
 
Regular Expression
Regular ExpressionRegular Expression
Regular Expression
 
Java: Regular Expression
Java: Regular ExpressionJava: Regular Expression
Java: Regular Expression
 
42.type: Literal-based Singleton types
42.type: Literal-based Singleton types42.type: Literal-based Singleton types
42.type: Literal-based Singleton types
 
Marc’s (bio)perl course
Marc’s (bio)perl courseMarc’s (bio)perl course
Marc’s (bio)perl course
 
JavaScript - Chapter 4 - Types and Statements
 JavaScript - Chapter 4 - Types and Statements JavaScript - Chapter 4 - Types and Statements
JavaScript - Chapter 4 - Types and Statements
 
Php basics
Php basicsPhp basics
Php basics
 
Functional programming with F#
Functional programming with F#Functional programming with F#
Functional programming with F#
 
Types and perl language
Types and perl languageTypes and perl language
Types and perl language
 
Scala Demystifying the Funky Stuff
Scala Demystifying the Funky StuffScala Demystifying the Funky Stuff
Scala Demystifying the Funky Stuff
 
Introduction To Scala
Introduction To ScalaIntroduction To Scala
Introduction To Scala
 
PHP Strings and Patterns
PHP Strings and PatternsPHP Strings and Patterns
PHP Strings and Patterns
 
06. haskell type builder
06. haskell type builder06. haskell type builder
06. haskell type builder
 
String variable in php
String variable in phpString variable in php
String variable in php
 
Bioinformatica: Esercizi su Perl, espressioni regolari e altre amenità (BMR G...
Bioinformatica: Esercizi su Perl, espressioni regolari e altre amenità (BMR G...Bioinformatica: Esercizi su Perl, espressioni regolari e altre amenità (BMR G...
Bioinformatica: Esercizi su Perl, espressioni regolari e altre amenità (BMR G...
 

Similar to Scala for Java Developers

Practically Functional
Practically FunctionalPractically Functional
Practically Functionaldjspiewak
 
Scala for Java Developers (Silicon Valley Code Camp 13)
Scala for Java Developers (Silicon Valley Code Camp 13)Scala for Java Developers (Silicon Valley Code Camp 13)
Scala for Java Developers (Silicon Valley Code Camp 13)Ramnivas Laddad
 
Naïveté vs. Experience
Naïveté vs. ExperienceNaïveté vs. Experience
Naïveté vs. ExperienceMike Fogus
 
Rewriting Java In Scala
Rewriting Java In ScalaRewriting Java In Scala
Rewriting Java In ScalaSkills Matter
 
Beginning Scala Svcc 2009
Beginning Scala Svcc 2009Beginning Scala Svcc 2009
Beginning Scala Svcc 2009David Pollak
 
Ruby For Java Programmers
Ruby For Java ProgrammersRuby For Java Programmers
Ruby For Java ProgrammersMike Bowler
 
Introduction to Scala for Java Developers
Introduction to Scala for Java DevelopersIntroduction to Scala for Java Developers
Introduction to Scala for Java DevelopersMichael Galpin
 
Python - Getting to the Essence - Points.com - Dave Park
Python - Getting to the Essence - Points.com - Dave ParkPython - Getting to the Essence - Points.com - Dave Park
Python - Getting to the Essence - Points.com - Dave Parkpointstechgeeks
 
Processing OWL2 Ontologies using Thea: An application of Logic Programming
Processing OWL2 Ontologies using Thea: An application of Logic ProgrammingProcessing OWL2 Ontologies using Thea: An application of Logic Programming
Processing OWL2 Ontologies using Thea: An application of Logic ProgrammingVangelis Vassiliadis
 
Thea: Processing OWL Ontologies - An application of logic programming
Thea: Processing OWL Ontologies - An application of logic programmingThea: Processing OWL Ontologies - An application of logic programming
Thea: Processing OWL Ontologies - An application of logic programmingguest57f623bf
 
1.2 Scala Basics
1.2 Scala Basics1.2 Scala Basics
1.2 Scala Basicsretronym
 

Similar to Scala for Java Developers (20)

Scala introduction
Scala introductionScala introduction
Scala introduction
 
Practically Functional
Practically FunctionalPractically Functional
Practically Functional
 
Scala for Java Developers (Silicon Valley Code Camp 13)
Scala for Java Developers (Silicon Valley Code Camp 13)Scala for Java Developers (Silicon Valley Code Camp 13)
Scala for Java Developers (Silicon Valley Code Camp 13)
 
Why Scala?
Why Scala?Why Scala?
Why Scala?
 
Scala 2 + 2 > 4
Scala 2 + 2 > 4Scala 2 + 2 > 4
Scala 2 + 2 > 4
 
Naïveté vs. Experience
Naïveté vs. ExperienceNaïveté vs. Experience
Naïveté vs. Experience
 
Rewriting Java In Scala
Rewriting Java In ScalaRewriting Java In Scala
Rewriting Java In Scala
 
Intro toswift1
Intro toswift1Intro toswift1
Intro toswift1
 
Beginning Scala Svcc 2009
Beginning Scala Svcc 2009Beginning Scala Svcc 2009
Beginning Scala Svcc 2009
 
Ruby For Java Programmers
Ruby For Java ProgrammersRuby For Java Programmers
Ruby For Java Programmers
 
Introduction to Scala for Java Developers
Introduction to Scala for Java DevelopersIntroduction to Scala for Java Developers
Introduction to Scala for Java Developers
 
Python - Getting to the Essence - Points.com - Dave Park
Python - Getting to the Essence - Points.com - Dave ParkPython - Getting to the Essence - Points.com - Dave Park
Python - Getting to the Essence - Points.com - Dave Park
 
Scala
ScalaScala
Scala
 
Scala presentationjune112011
Scala presentationjune112011Scala presentationjune112011
Scala presentationjune112011
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
Perl Presentation
Perl PresentationPerl Presentation
Perl Presentation
 
Processing OWL2 Ontologies using Thea: An application of Logic Programming
Processing OWL2 Ontologies using Thea: An application of Logic ProgrammingProcessing OWL2 Ontologies using Thea: An application of Logic Programming
Processing OWL2 Ontologies using Thea: An application of Logic Programming
 
Thea: Processing OWL Ontologies - An application of logic programming
Thea: Processing OWL Ontologies - An application of logic programmingThea: Processing OWL Ontologies - An application of logic programming
Thea: Processing OWL Ontologies - An application of logic programming
 
1.2 Scala Basics
1.2 Scala Basics1.2 Scala Basics
1.2 Scala Basics
 
Scala introduction
Scala introductionScala introduction
Scala introduction
 

Recently uploaded

Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 

Recently uploaded (20)

Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 

Scala for Java Developers

  • 1. Scala for Java Developers © 2011 SpringOne 2GX. All rights reserved. Do not distribute without permission.
  • 2. What is Scala “ a general purpose programming language designed to express common programming patterns in a concise , elegant , and type-safe way. It smoothly integrates features of object-oriented and functional languages, enabling Java and other programmers to be more productive .” http://www.scala-lang.org
  • 3.
  • 4.
  • 5.
  • 6.
  • 7. Hello World: Scripting Style $ scala hello-script.scala Hello World No compilation
  • 8. Hello World: Porting of Java Code $ scalac hello-java.scala $ scala example.Main Hello World ‘ static’ Inferred semicolons
  • 9. Hello World: Using the App trait $ scalac hello-app.scala $ scala example.Main Hello World
  • 10. Simple Class class Person val p = new Person Type Inferred Default access: public No curly braces needed (but allowed)
  • 11. Simple Class class Person val p: Person = new Person Explicit type specification
  • 12. Class with constructor class Person(firstName: String, lastName: String) val p = new Person( &quot;Ramnivas&quot; , &quot;Laddad&quot; ) println(p.firstName) // Error Primary constructor Fields – accessible in class body
  • 13. Class with “getters” class Person( val firstName: String, val lastName: String) val p = new Person( &quot;Ramnivas&quot; , &quot;Laddad&quot; ) println(p.firstName) Value (Java ‘final’)
  • 14. Class with “getters” and “setters” class Person( var firstName: String, var lastName: String) val p = new Person( &quot;Ramnivas&quot; , &quot;Laddad&quot; ) println(p.firstName) p.firstName = &quot;Ramnivas2” Variable (Java non-final)
  • 15. Extending a class val s = new Student( &quot;Ramnivas&quot; , &quot;Laddad&quot; , 1) println(s.firstName) println(s.grade)
  • 16. Defining methods class Person( val firstName: String, val lastName: String) { def name = firstName + &quot; &quot; + lastName override def toString = name } val p = new Person( &quot;Ramnivas&quot; , &quot;Laddad&quot; ) println(p.name) // Ramnivas Laddad println(p) // Ramnivas Laddad Not optional
  • 17. Uniform access principle class Person( val firstName: String, val lastName: String) { val name = firstName + &quot; &quot; + lastName override def toString = name } val p = new Person( &quot;Ramnivas&quot; , &quot;Laddad&quot; ) println(p.name) // Ramnivas Laddad println(p) // Ramnivas Laddad
  • 18.
  • 19.
  • 20.
  • 21. Traits: Interfaces done right trait PartyGoer { val age: Int val yearsUntilLegalDrinking = if (age >= 18) 0 else 18-age }
  • 22. Collections val people = List( &quot;John&quot; , &quot;Jacob&quot; , &quot;Mike&quot; )
  • 23. Collections val people = Array( &quot;John&quot; , &quot;Jacob&quot; , &quot;Mike&quot; )
  • 24. Working with collections: for comprehension for (person <- people) { println(person) }
  • 25. Working with collections: for comprehension for (person <- people if person startsWith &quot;J&quot; ) { println( &quot;&quot;&quot;Lucky one to start name in &quot;J&quot; &quot;&quot;&quot; + person) } // You are lucky one to start name in &quot;J&quot; John // You are lucky one to start name in &quot;J&quot; Jacob
  • 26. Working with collections: filter val student1 = new Student( &quot;first1&quot; , &quot;last1&quot; , 1) val student2 = new Student( &quot;first2&quot; , &quot;last2&quot; , 1) val student3 = new Student( &quot;first3&quot; , &quot;last3&quot; , 2) val student4 = new Student( &quot;first4&quot; , &quot;last4&quot; , 6) val students = List(student1, student2, student3, student4)
  • 27. Working with collections: filter val student1 = new Student( &quot;first1&quot; , &quot;last1&quot; , 1) val student2 = new Student( &quot;first2&quot; , &quot;last2&quot; , 1) val student3 = new Student( &quot;first3&quot; , &quot;last3&quot; , 2) val student4 = new Student( &quot;first4&quot; , &quot;last4&quot; , 6) val students = List(student1, student2, student3, student4)
  • 28. Working with collections: using _ val student1 = new Student( &quot;first1&quot; , &quot;last1&quot; , 1) val student2 = new Student( &quot;first2&quot; , &quot;last2&quot; , 1) val student3 = new Student( &quot;first3&quot; , &quot;last3&quot; , 2) val student4 = new Student( &quot;first4&quot; , &quot;last4&quot; , 6) val students = List(student1, student2, student3, student4)
  • 29. Working with collections: passing method as function val student1 = new Student( &quot;first1&quot; , &quot;last1&quot; , 1) val student2 = new Student( &quot;first2&quot; , &quot;last2&quot; , 1) val student3 = new Student( &quot;first3&quot; , &quot;last3&quot; , 2) val student4 = new Student( &quot;first4&quot; , &quot;last4&quot; , 6) val students = List(student1, student2, student3, student4)
  • 30. Working with collections: partition val student1 = new Student( &quot;first1&quot; , &quot;last1&quot; , 1) val student2 = new Student( &quot;first2&quot; , &quot;last2&quot; , 1) val student3 = new Student( &quot;first3&quot; , &quot;last3&quot; , 2) val student4 = new Student( &quot;first4&quot; , &quot;last4&quot; , 6) val students = List(student1, student2, student3, student4) val (elementarySchoolers, middleSchoolers) = students .partition(_.grade < 6) println( elementarySchoolers ) println( middleSchoolers ) //List(first1 last1, first2 last2, first3 last3) //List(first4 last4) Tuple
  • 31. Working with collections: transforming val student1 = new Student( &quot;first1&quot; , &quot;last1&quot; , 1) val student2 = new Student( &quot;first2&quot; , &quot;last2&quot; , 1) val student3 = new Student( &quot;first3&quot; , &quot;last3&quot; , 2) val student4 = new Student( &quot;first4&quot; , &quot;last4&quot; , 6) val students = List(student1, student2, student3, student4)
  • 33.
  • 34. Putting it together: Quicksort def quicksort[T](input: Traversable[T]) (ordering: Ordering[T]) : Traversable[T] = if (input.isEmpty) { input } else { val (low, high) = input.tail.partition(ordering.lt(_, input.head)) quicksort(low)(ordering) ++ List(input.head) ++ quicksort(high)(ordering) } println(quicksort(List(1, 3, 4, 5, 1))(Ordering.Int))
  • 35. Putting it together: Quicksort println(quicksort(List(1, 3, 4, 5, 1)))
  • 36. Pattern matching: Basics val a:Any = &quot;foo&quot; a match { case str: String => println( &quot;A string: &quot; + str) case i: Int => println( &quot;An int: &quot; + i) case _ => println( &quot;Something else&quot; ) }
  • 37. Pattern matching: with collections val l = List( &quot;a&quot; , &quot;b&quot; , &quot;c&quot; ) l match { case Nil => println( &quot;Empty!&quot; ) case head :: Nil => println( &quot;Only one item &quot; + head) case head :: tail => println( &quot;Item &quot; + head + &quot; followed by &quot; + tail) }
  • 38. Quicksort with pattern matching def quicksort[T](input: Traversable[T]) ( implicit ordering: Ordering[T]) : Traversable[T] = input match { case head :: tail => val (low, high) = tail.partition(ordering.lt(_, head)) quicksort(low) ++ List(head) ++ quicksort(high) case _ => input } println(quicksort(List(1, 3, 4, 5, 1)))
  • 39. Destutter using Pattern matching def destutter[A](lst: List[A]): List[A] = lst match { case h1 :: h2 :: tail if (h1 == h2) => destutter(h2 :: tail) case h1 :: h2 :: tail => h1 :: destutter(h2 :: tail) case _ => lst } // destutter(List(1,1,1,1,1,1)) => List(1) // destutter(List(1,1,4,3,3,2)) => List(1,4,3,2) // destutter(List() )=> List()
  • 40.
  • 41. Case classes case class Human(name: String) case class SuperHero(name: String, power: String) val characters = List(Human( &quot;Programmer&quot; ), SuperHero( &quot;Customer&quot; , &quot;money&quot; ), SuperHero( &quot;QA&quot; , &quot;testing&quot; ))
  • 42. Case classes and pattern matching val actions = for (character <- characters) yield character match { case Human(name) => name + &quot; needs to be saved&quot; case SuperHero(name, power) => name + &quot; will save using &quot; + power } actions.foreach(println)
  • 43. Pattern matching and extracting just enough val actions = for (character <- characters) yield character match { case Human(name) => name + &quot; needs to be saved&quot; case SuperHero(_, power) => &quot;Could be saved using &quot; + power } actions.foreach(println) // Programmer needs to be saved // Could be saved using money // Could be saved using testing
  • 44. Regular expressions val text = &quot;Ramnivas Laddad&quot; val Name = &quot;&quot;&quot;(+)+(+)&quot;&quot;&quot; .r val person = text match { case Name(first, last) => Some( new Person(first, last)) case _ => None } println(person) // Some(Ramnivas Laddad)
  • 45. Options val texts = List( &quot;Ramnivas Laddad&quot; , &quot;foo&quot; , &quot;Scott Andrews&quot; ) val peopleOptions = texts.map { _ match { case Name(first, last) => Some( new Person(first, last)) case _ => None } } println(peopleOptions) // List(Some(Ramnivas Laddad), None, Some(Scott Andrews))
  • 46. Options: flattening val texts = List( &quot;Ramnivas Laddad&quot; , &quot;foo&quot; , &quot;Scott Andrews&quot; ) val peopleOptions = texts.map { _ match { case Name(first, last) => Some( new Person(first, last)) case _ => None } } println(peopleOptions.flatten) // List(Ramnivas Laddad, Scott Andrews)
  • 47. Options: flatMap val texts = List( &quot;Ramnivas Laddad&quot; , &quot;foo&quot; , &quot;Scott Andrews&quot; ) val people = texts.flatMap { _ match { case Name(first, last) => Some( new Person(first, last)) case _ => None } } println(people) // List(Ramnivas Laddad, Scott Andrews)
  • 48. Higher order functions def process() : Unit = { retry(5) { ... } } def retry[T](maxRetry: Int)(thunk: => T) = { def retry(thunk: => T, attempt: Int): T = { try { thunk } catch { case ex if (attempt < maxRetry) => retry(thunk, attempt + 1) } } retry(thunk, 0) } Thunk
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56. Scala for Java Developers © 2011 SpringOne 2GX. All rights reserved. Do not distribute without permission.

Editor's Notes

  1. No access spec (default: public), no parentheses, type inference
  2. How constructor params can be used in body