SlideShare a Scribd company logo
1 of 32
Download to read 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

More Related Content

What's hot

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
 

What's hot (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
 

Similar to 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
 

Similar to 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
 

Recently uploaded

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 Processorsdebabhi2
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
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
 
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...Martijn de Jong
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 

Recently uploaded (20)

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
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
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
 
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...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 

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