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
 
The Death of Final Tagless
The Death of Final TaglessThe Death of Final Tagless
The Death of Final Tagless
John De Goes
 

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

pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi 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 Prokopec
Loïc Descotte
 

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

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Último (20)

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
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
 
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
 
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
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
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...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
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?
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
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
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 

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