Upgrade to Pro — share decks privately, control downloads, hide ads and more …

A bit about Scala

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

A bit about Scala

Выступление в рамках спецкурса "Немейнстримовые технологии разработки", читаемого в НГУ. http://bit.ly/mainstreamless

Avatar for Vladimir Parfinenko

Vladimir Parfinenko

November 30, 2012
Tweet

More Decks by Vladimir Parfinenko

Other Decks in Programming

Transcript

  1. SCALA Martin Odersky разрабатывал Scala с 2001 года в École

    Polytechnique Fédérale de Lausanne, релиз состоялся в 2003 году. NEW
  2. ПОПУЛЯРНОСТЬ • 11 место – RedMonk Programming Language Rankings, популярность

    на Stack Overflow и GitHub • 36 место – TIOBE index, популярность поисковых запросов
  3. ИДЕИ SCALA • Безопасность и эффективность • Гибкость языка, мощный

    синтаксис • Объектно-ориентированность • Функциональность
  4. HELLO WORLD! object HelloWorld extends App { println("Hello, world!") }

    $ cat > HelloWorld.scala $ scalac HelloWorld.scala $ scala HelloWorld Hello, world!
  5. STATIC TYPING var i = 37 i = 42 i

    = "Foo" // error: type mismatch; // found : java.lang.String("Foo") // required: Int
  6. 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
  7. 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) idom(3) should be (0) } } 0 1 2 3
  8. 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") }
  9. 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") }
  10. 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)
  11. 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) = ... }
  12. 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 }
  13. 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")
  14. 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 { _ + _ }
  15. SCALA COLLECTIONS • Seq • IndexedSeq, Buffer, … • Set

    • HashSet, BitSet, … • Map • HashMap, TreeMap, … Traversable Iterable Seq Set Map TraversableOnce Iterator
  16. SCALA COLLECTIONS • collect • count • exists • filter

    • find • flatMap • fold • forall • foreach • groupBy • map • max/min • partition • reduce • splitAt • take • to • …
  17. DEMO import java.util.ArrayList; // ... Person[] people, minors, adults; void

    foo() { ArrayList<Person> minorsList = new ArrayList<Person>(); 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()]); } val people: Array[Person] val (minors, adults) = people partition { _.age < 18 } Java Scala
  18. PATTERN MATCHING val str = num match { case 1

    => "one" case 2 => "two" case _ => "many" }
  19. 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" }
  20. 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 }
  21. 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)
  22. BONUS: CONCURRENCY actor { receive { case people: Set[Person] =>

    val (minors, adults) = people partition { _.age < 18 } School ! minors Work ! adults } }
  23. BONUS: PARALLELISM val people: Array[Person] val (minors, adults) = people

    partition { _.age < 18 } val (minors, adults) = people.par partition { _.age < 18 } Magic!
  24. 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 }
  25. РЕСУРСЫ • 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