SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
НЕМНОГО О SCALA
     Владимир Парфиненко
  vladimir.parfinenko@gmail.com
              @cypok
NEW

       SCALA
       Martin Odersky
 разрабатывал Scala с 2001
 года в École Polytechnique
   Fédérale de Lausanne,
релиз состоялся в 2003 году.
ПОПУЛЯРНОСТЬ

• 11
   место – RedMonk Programming Language Rankings,
 популярность на Stack Overflow и GitHub

• 36   место – TIOBE index, популярность поисковых запросов
ИДЕИ SCALA


• Безопасность   и эффективность

• Гибкость   языка, мощный синтаксис

• Объектно-ориентированность

• Функциональность
БЕЗОПАСНОСТЬ И ЭФФЕКТИВНОСТЬ
HELLO WORLD!

$ cat > HelloWorld.scala
object HelloWorld extends App {
  println("Hello, world!")
}

$ scalac HelloWorld.scala

$ scala HelloWorld
Hello, world!
STATIC TYPING

var i = 37
i = 42
i = "Foo" // error: type mismatch;
           // found   : java.lang.String("Foo")
           // required: Int
ГИБКОСТЬ ЯЗЫКА, МОЩНЫЙ СИНТАКСИС
HELLO REPL!

scala> val repl = Map('R' -> "Read", 'E' -> "Eval",
     |                'P' -> "Print", 'L' -> "Loop")

scala> for ((k, v) <- repl) println(k + " is for " + v)
R is for Read
E is for Eval
P is for Print
L is for Loop
DSL

class DominatorsSuite extends FunSuite with ShouldMatchers
                          with GraphBuilderDSL {
  test("diamond") {
    calcDominatorsOver(0 -> (1 || 2) -> 3)
    idom(1) should be (0)
    idom(2) should be (0)                        0
    idom(3) should be (0)
  }
}
                                             1       2


                                                 3
ОБЪЕКТНО-ОРИЕНТИРОВАННОСТЬ
BACK TO THE JAVA
// Person.java
public class Person {
    public final String name;
    public final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

// Mainstreamless.scala
object Mainstreamless extends App {
  val p = new Person("John", 20)
  println(p.name + " is " + p.age + " years old")
}
SCALA STRIKES BACK
class Person(val name: String, val age: Int)




object Mainstreamless extends App {
  val p = new Person("John", 20)
  println(p.name + " is " + p.age + " years old")
}
OOP: CLASSES
abstract class Animal {
  def name: String
}

class Person(firstName: String, lastName: String)
    extends Animal {
  val name = firstName + " " + lastName
}

class Student(firstName: String, lastName: String, val year: Int)
    extends Person(firstName, lastName)
OOP: TRAITS
trait Ordered[A] {
  def compare(that: A): Int

    def   < (that: A): Boolean =    (this compare that)   <    0
    def   > (that: A): Boolean =    (this compare that)   >    0
    def   <= (that: A): Boolean =   (this compare that)   <=   0
    def   >= (that: A): Boolean =   (this compare that)   >=   0
    def   compareTo(that: A): Int   = compare(that)
}

class Money extends Ordered[Money] with SomeOtherTrait {
  def compare(that: Money) = ...
}
OOP: TYPES
class Duck {
  def quack = println("Quaaaaaack!")
  def feathers = println("The duck has white and gray feathers.")
}

class Person {
  def quack = println("The person imitates a duck.")
  def feathers = println("The person takes a feather
                          from the ground and shows it.")
}

def inTheForest(duck: { def quack; def feathers }) = {
  duck.quack
  duck.feathers
}
OOP: TYPES
scala> inTheForest(new Duck)
Quaaaaaack!
The duck has white and gray feathers.

scala> inTheForest(new Person)
The person imitates a duck.
The person takes a feather from the ground and shows it.



scala> inTheForest("Duck")
error: type mismatch;
 found   : java.lang.String("Duck")
 required: AnyRef{def quack: Unit; def feathers: Unit}
       inTheForest("Duck")
λ
ФУНКЦИОНАЛЬНОСТЬ
FUNCTIONS
def inc(x: Int): Int = {
  x + 1
}

def inc(x: Int) = x + 1

val inc = { x: Int => x + 1 }



inc(3) // 4

Seq(1, 2, 3) map inc // Seq(2, 3, 4)

// 1 + 2 + 3
Seq(1, 2, 3) reduce { x, y => x + y }
Seq(1, 2, 3) reduce { _ + _ }
SCALA COLLECTIONS

• Seq
                              TraversableOnce
  • IndexedSeq, Buffer, …
                            Iterator    Traversable
• Set
                                         Iterable
  • HashSet, BitSet, …
                                  Seq      Set        Map
• Map

  • HashMap, TreeMap, …
SCALA COLLECTIONS

• collect        • fold      • partition

• count          • forall    • reduce

• exists         • foreach   • splitAt

• filter          • groupBy   • take

• find            • map       • to

• flatMap         • max/min   •…
DEMO
        import java.util.ArrayList;
        // ...
        Person[] people, minors, adults;
        void foo() {
            ArrayList<Person> minorsList = new ArrayList<Person>();
Java




            ArrayList<Person> adultsList = new ArrayList<Person>();
            for (Person person : people)
                (person.age < 18 ? minorsList : adultsList).
                     add(person);
            minors = minorsList.toArray(new Person[minorsList.size()]);
            adults = adultsList.toArray(new Person[adultsList.size()]);
        }
Scala




        val people: Array[Person]
        val (minors, adults) = people partition { _.age < 18 }
PATTERN MATCHING


    val str = num match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
    }
PATTERN MATCHING


val str = anything match {
  case x: Int if x > 0 => "positive integer"
  case x: Float if x > 0 => "positive real"
  case _: String => "string"
  case _ => "unknown"
}
CASE CLASSES
sealed class Element

case   class   Var(name: String) extends Element
case   class   Num(value: Int) extends Element
case   class   Neg(arg: Element) extends Element
case   class   Add(arg1: Element, arg2: Element) extends Element

def optimize(elem: Element): Element = elem match {
  case Neg(Neg(x))              => optimize(x)
  case Add(x, Num(0))           => optimize(x)
  case Neg(Num(x))              => Num(-x)
  case Add(x, Neg(y)) if x == y => Num(0)
  case Add(Num(x), Num(y))      => Num(x + y)
  case Neg(x)                   => Neg(optimize(x))
  case Add(x, y)                => Add(optimize(x), optimize(y))
  case _                        => elem
}
One more thing...
BONUS: FUNCTIONAL


 def modN(n: Int)(x: Int) = ((x % n) == 0)

 val nums = Seq(1, 2, 3, 4, 5, 6, 7, 8)

 nums filter modN(2) // Seq(2, 4, 6, 8)
 nums filter modN(3) // Seq(3, 6)
BONUS: CONCURRENCY


actor {
  receive {
    case people: Set[Person] =>
      val (minors, adults) = people partition { _.age < 18 }
      School ! minors
      Work ! adults
  }
}
BONUS: PARALLELISM


val people: Array[Person]

val (minors, adults) = people partition { _.age < 18 }

val (minors, adults) = people.par partition { _.age < 18 }




                                     ag ic!
                                    M
BONUS: FUTURES
val f: Future[List[String]] = future {
  session.getRecentPosts
}

f onFailure {
  case t => println("An error has occured: " + t.getMessage)
}

f onSuccess {
  case posts => posts foreach println
}
ЗАДАЧКА

val expr = Div(Add(Var("a"), Num(37)), Num(2))
expr.draw()



                  a + 37
                  ------
                    2
РЕСУРСЫ

• http://github.com/cypok/mainstreamless        – условие задачи

• http://www.scala-lang.org

• http://docs.scala-lang.org   – guides & tutorials

• Programming    in Scala: Second Edition – good book

• http://scala-ide.org   – Scala IDE for Eclipse

• http://plugins.intellij.net/plugin/?id=1347   – IntelliJ IDEA plugin

Mais conteúdo relacionado

Mais procurados

Scala-对Java的修正和超越
Scala-对Java的修正和超越Scala-对Java的修正和超越
Scala-对Java的修正和超越Caoyuan Deng
 
Scala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldScala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldBTI360
 
Scalaz 8: A Whole New Game
Scalaz 8: A Whole New GameScalaz 8: A Whole New Game
Scalaz 8: A Whole New GameJohn De Goes
 
Scala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereldScala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereldWerner Hofstra
 
JavaScript Web Development
JavaScript Web DevelopmentJavaScript Web Development
JavaScript Web Developmentvito jeng
 
A Prelude of Purity: Scaling Back ZIO
A Prelude of Purity: Scaling Back ZIOA Prelude of Purity: Scaling Back ZIO
A Prelude of Purity: Scaling Back ZIOJorge Vásquez
 
From Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risksFrom Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risksSeniorDevOnly
 
The Death of Final Tagless
The Death of Final TaglessThe Death of Final Tagless
The Death of Final TaglessJohn De Goes
 
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
JDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation streamJDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation stream
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation streamRuslan Shevchenko
 
Scala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesScala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesTomer Gabel
 
Scala for ruby programmers
Scala for ruby programmersScala for ruby programmers
Scala for ruby programmerstymon Tobolski
 
λ | Lenses
λ | Lensesλ | Lenses
λ | LensesOpen-IT
 
Scala or functional programming from a python developer's perspective
Scala or functional programming from a python developer's perspectiveScala or functional programming from a python developer's perspective
Scala or functional programming from a python developer's perspectivegabalese
 
Exploring type level programming in Scala
Exploring type level programming in ScalaExploring type level programming in Scala
Exploring type level programming in ScalaJorge Vásquez
 
Practical scalaz
Practical scalazPractical scalaz
Practical scalazoxbow_lakes
 

Mais procurados (20)

Scala-对Java的修正和超越
Scala-对Java的修正和超越Scala-对Java的修正和超越
Scala-对Java的修正和超越
 
1.2 scala basics
1.2 scala basics1.2 scala basics
1.2 scala basics
 
Scala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldScala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 World
 
Scala collections
Scala collectionsScala collections
Scala collections
 
Scalaz 8: A Whole New Game
Scalaz 8: A Whole New GameScalaz 8: A Whole New Game
Scalaz 8: A Whole New Game
 
Scala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereldScala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereld
 
JavaScript Web Development
JavaScript Web DevelopmentJavaScript Web Development
JavaScript Web Development
 
A Prelude of Purity: Scaling Back ZIO
A Prelude of Purity: Scaling Back ZIOA Prelude of Purity: Scaling Back ZIO
A Prelude of Purity: Scaling Back ZIO
 
From Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risksFrom Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risks
 
Scala in Places API
Scala in Places APIScala in Places API
Scala in Places API
 
The Death of Final Tagless
The Death of Final TaglessThe Death of Final Tagless
The Death of Final Tagless
 
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
JDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation streamJDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation stream
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
 
Scala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesScala Back to Basics: Type Classes
Scala Back to Basics: Type Classes
 
Scala for ruby programmers
Scala for ruby programmersScala for ruby programmers
Scala for ruby programmers
 
λ | Lenses
λ | Lensesλ | Lenses
λ | Lenses
 
Scala in practice
Scala in practiceScala in practice
Scala in practice
 
Scala or functional programming from a python developer's perspective
Scala or functional programming from a python developer's perspectiveScala or functional programming from a python developer's perspective
Scala or functional programming from a python developer's perspective
 
Scalaz
ScalazScalaz
Scalaz
 
Exploring type level programming in Scala
Exploring type level programming in ScalaExploring type level programming in Scala
Exploring type level programming in Scala
 
Practical scalaz
Practical scalazPractical scalaz
Practical scalaz
 

Semelhante a A bit about Scala

An Introduction to Scala (2014)
An Introduction to Scala (2014)An Introduction to Scala (2014)
An Introduction to Scala (2014)William Narmontas
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
(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 ProkopecLoïc Descotte
 
Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?Jesper Kamstrup Linnet
 
여자개발자모임터 6주년 개발 세미나 - Scala Language
여자개발자모임터 6주년 개발 세미나 - Scala Language여자개발자모임터 6주년 개발 세미나 - Scala Language
여자개발자모임터 6주년 개발 세미나 - Scala LanguageAshal aka JOKER
 
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 developersMatthew Farwell
 
Scala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghScala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghStuart Roebuck
 
The Scala Programming Language
The Scala Programming LanguageThe Scala Programming Language
The Scala Programming Languageleague
 

Semelhante a A bit about Scala (20)

Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
Scala
ScalaScala
Scala
 
An Introduction to Scala (2014)
An Introduction to Scala (2014)An Introduction to Scala (2014)
An Introduction to Scala (2014)
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
(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?
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar Prokopec
 
Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
여자개발자모임터 6주년 개발 세미나 - Scala Language
여자개발자모임터 6주년 개발 세미나 - Scala Language여자개발자모임터 6주년 개발 세미나 - Scala Language
여자개발자모임터 6주년 개발 세미나 - Scala Language
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
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
 
ScalaBlitz
ScalaBlitzScalaBlitz
ScalaBlitz
 
Scala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghScala @ TechMeetup Edinburgh
Scala @ TechMeetup Edinburgh
 
Scala - en bedre Java?
Scala - en bedre Java?Scala - en bedre Java?
Scala - en bedre Java?
 
Spark workshop
Spark workshopSpark workshop
Spark workshop
 
The Scala Programming Language
The Scala Programming LanguageThe Scala Programming Language
The Scala Programming Language
 

Último

Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
 
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 SavingEdi Saputra
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...apidays
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfOrbitshub
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 

Último (20)

Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
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
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 

A bit about Scala

  • 1. НЕМНОГО О SCALA Владимир Парфиненко vladimir.parfinenko@gmail.com @cypok
  • 2. NEW SCALA Martin Odersky разрабатывал Scala с 2001 года в École Polytechnique Fédérale de Lausanne, релиз состоялся в 2003 году.
  • 3. ПОПУЛЯРНОСТЬ • 11 место – RedMonk Programming Language Rankings, популярность на Stack Overflow и GitHub • 36 место – TIOBE index, популярность поисковых запросов
  • 4. ИДЕИ SCALA • Безопасность и эффективность • Гибкость языка, мощный синтаксис • Объектно-ориентированность • Функциональность
  • 6. HELLO WORLD! $ cat > HelloWorld.scala object HelloWorld extends App { println("Hello, world!") } $ scalac HelloWorld.scala $ scala HelloWorld Hello, world!
  • 7. STATIC TYPING var i = 37 i = 42 i = "Foo" // error: type mismatch; // found : java.lang.String("Foo") // required: Int
  • 9. HELLO REPL! scala> val repl = Map('R' -> "Read", 'E' -> "Eval", | 'P' -> "Print", 'L' -> "Loop") scala> for ((k, v) <- repl) println(k + " is for " + v) R is for Read E is for Eval P is for Print L is for Loop
  • 10. DSL class DominatorsSuite extends FunSuite with ShouldMatchers with GraphBuilderDSL { test("diamond") { calcDominatorsOver(0 -> (1 || 2) -> 3) idom(1) should be (0) idom(2) should be (0) 0 idom(3) should be (0) } } 1 2 3
  • 12. BACK TO THE JAVA // Person.java public class Person { public final String name; public final int age; public Person(String name, int age) { this.name = name; this.age = age; } } // Mainstreamless.scala object Mainstreamless extends App { val p = new Person("John", 20) println(p.name + " is " + p.age + " years old") }
  • 13. SCALA STRIKES BACK class Person(val name: String, val age: Int) object Mainstreamless extends App { val p = new Person("John", 20) println(p.name + " is " + p.age + " years old") }
  • 14. OOP: CLASSES abstract class Animal { def name: String } class Person(firstName: String, lastName: String) extends Animal { val name = firstName + " " + lastName } class Student(firstName: String, lastName: String, val year: Int) extends Person(firstName, lastName)
  • 15. OOP: TRAITS trait Ordered[A] { def compare(that: A): Int def < (that: A): Boolean = (this compare that) < 0 def > (that: A): Boolean = (this compare that) > 0 def <= (that: A): Boolean = (this compare that) <= 0 def >= (that: A): Boolean = (this compare that) >= 0 def compareTo(that: A): Int = compare(that) } class Money extends Ordered[Money] with SomeOtherTrait { def compare(that: Money) = ... }
  • 16. OOP: TYPES class Duck { def quack = println("Quaaaaaack!") def feathers = println("The duck has white and gray feathers.") } class Person { def quack = println("The person imitates a duck.") def feathers = println("The person takes a feather from the ground and shows it.") } def inTheForest(duck: { def quack; def feathers }) = { duck.quack duck.feathers }
  • 17. OOP: TYPES scala> inTheForest(new Duck) Quaaaaaack! The duck has white and gray feathers. scala> inTheForest(new Person) The person imitates a duck. The person takes a feather from the ground and shows it. scala> inTheForest("Duck") error: type mismatch; found : java.lang.String("Duck") required: AnyRef{def quack: Unit; def feathers: Unit} inTheForest("Duck")
  • 19. FUNCTIONS def inc(x: Int): Int = { x + 1 } def inc(x: Int) = x + 1 val inc = { x: Int => x + 1 } inc(3) // 4 Seq(1, 2, 3) map inc // Seq(2, 3, 4) // 1 + 2 + 3 Seq(1, 2, 3) reduce { x, y => x + y } Seq(1, 2, 3) reduce { _ + _ }
  • 20. SCALA COLLECTIONS • Seq TraversableOnce • IndexedSeq, Buffer, … Iterator Traversable • Set Iterable • HashSet, BitSet, … Seq Set Map • Map • HashMap, TreeMap, …
  • 21. SCALA COLLECTIONS • collect • fold • partition • count • forall • reduce • exists • foreach • splitAt • filter • groupBy • take • find • map • to • flatMap • max/min •…
  • 22. DEMO import java.util.ArrayList; // ... Person[] people, minors, adults; void foo() { ArrayList<Person> minorsList = new ArrayList<Person>(); Java ArrayList<Person> adultsList = new ArrayList<Person>(); for (Person person : people) (person.age < 18 ? minorsList : adultsList). add(person); minors = minorsList.toArray(new Person[minorsList.size()]); adults = adultsList.toArray(new Person[adultsList.size()]); } Scala val people: Array[Person] val (minors, adults) = people partition { _.age < 18 }
  • 23. PATTERN MATCHING val str = num match { case 1 => "one" case 2 => "two" case _ => "many" }
  • 24. PATTERN MATCHING val str = anything match { case x: Int if x > 0 => "positive integer" case x: Float if x > 0 => "positive real" case _: String => "string" case _ => "unknown" }
  • 25. CASE CLASSES sealed class Element case class Var(name: String) extends Element case class Num(value: Int) extends Element case class Neg(arg: Element) extends Element case class Add(arg1: Element, arg2: Element) extends Element def optimize(elem: Element): Element = elem match { case Neg(Neg(x)) => optimize(x) case Add(x, Num(0)) => optimize(x) case Neg(Num(x)) => Num(-x) case Add(x, Neg(y)) if x == y => Num(0) case Add(Num(x), Num(y)) => Num(x + y) case Neg(x) => Neg(optimize(x)) case Add(x, y) => Add(optimize(x), optimize(y)) case _ => elem }
  • 27. BONUS: FUNCTIONAL def modN(n: Int)(x: Int) = ((x % n) == 0) val nums = Seq(1, 2, 3, 4, 5, 6, 7, 8) nums filter modN(2) // Seq(2, 4, 6, 8) nums filter modN(3) // Seq(3, 6)
  • 28. BONUS: CONCURRENCY actor { receive { case people: Set[Person] => val (minors, adults) = people partition { _.age < 18 } School ! minors Work ! adults } }
  • 29. BONUS: PARALLELISM val people: Array[Person] val (minors, adults) = people partition { _.age < 18 } val (minors, adults) = people.par partition { _.age < 18 } ag ic! M
  • 30. BONUS: FUTURES val f: Future[List[String]] = future { session.getRecentPosts } f onFailure { case t => println("An error has occured: " + t.getMessage) } f onSuccess { case posts => posts foreach println }
  • 31. ЗАДАЧКА val expr = Div(Add(Var("a"), Num(37)), Num(2)) expr.draw() a + 37 ------ 2
  • 32. РЕСУРСЫ • http://github.com/cypok/mainstreamless – условие задачи • http://www.scala-lang.org • http://docs.scala-lang.org – guides & tutorials • Programming in Scala: Second Edition – good book • http://scala-ide.org – Scala IDE for Eclipse • http://plugins.intellij.net/plugin/?id=1347 – IntelliJ IDEA plugin