SlideShare a Scribd company logo
Java
         Scala

          2009.10 SD2China

Caoyuan (NetBeans Dream Team Memeber)


     http://blogtrader.net/dcaoyuan/
•   JVM
    123.toByte
    "1".toInt
    true.toString


•   val compare = (x: Int, y: Int) => x > y
    compare(1, 2) // result: Boolean = false


•   Java sta&c
                                (   )                Scala   object
    object Dog {
      val whatever = "dog" // static field in Java
    }
    class Dog {
      def callWhatever = Dog.whatever
    }
•   val compare = (x: Int, y: Int) => x > y
    list sortWith compare


•   class AComparator {
      def compare(x: Int, y: Int) = x > y
    }
    list sortWith (new AComparator).compare


•   object annonymous extends scala.Function2[Int, Int, Boolean] {
      override def apply(x: Int, y: Int) = x > y
    }
    list sortWith annonymous


•           sta&c                             object
          (     )
(1)
•   1.+(1)
                                                              ”.” ”()”
    1 + 1
    1.>(0)
    1 > 0
    (1 > 0).&(2 > 1)
    (1 > 0) & 2 > 1
    stack.push(10)
    stack push 10
    stack.pop
    stack pop

•   stack   push {
                                      {...}
      val   a = 1
      val   b = 2
      a +   b
    }

•   def !@#%^&*-<=>?|~:/ = println("noop")
    def √(x: Double) = Math.sqrt(x)
    val Π = Math.Pi
    val r = √(9*Π)

•   ‘<’, ‘>’                                  ’[’ ‘]’
(2)
•   for
    for (i <- List(1, 2)) {
      println(i)
    }
    List(1, 2) foreach {i => println(i)}

    for (i <- List(1, 2)) yield {
      i + 10
    }
    List(1, 2) map {i => i + 10}


•   // synchronized is function call instead of keyword
    def check = synchronized {
      // isInstanceOf is function call instead of keyword
      100.isInstanceOf[String]
    }


•   stack.pop.asInstanceOf[Int] // (Integer) stack.pop() in Java
•                                      return
    val r1 = { // return 3
      val a = 1
      val b = 2
      a + b
    }

    val r2 = if (true) 1 else 2

    val r3 = // return (): Unit
      for (i <- List(1, 2)) {
        println(i)
      }

    val r4 = // return List(11, 12)
      for (i <- List(1, 2)) yield {
        i + 10
      }

    val r5 = // return java.io.File
      try {
        val f = new File("afile")
        f
      } catch {
        case ex: IOException => null
      }
Scala




           (   )


           =
        OO + FP
Scala-对Java的修正和超越
(1)
•   Scala                              Any Any                JVM

    •   JVM             (byte, short, char, int, long, float, double, boolean) void
    •     Scala     (Byte, Short, Char, Int, Long, Float, Double, Boolean) Unit
           AnyVal
    •   JVM               AnyRef (java.lang.Object)

    // Scala, Array     8
    val arrayOfListOfString = new Array[List[String]](10)
    val arrayOfAny: Array[_] = Array(1, 2)
    // Java
    List<String>[] arrayOfListOfString = new ArrayList<String>[10]



•   Scala                                 Null     Nothing
    •   JVM    null      Null              AnyRef
    •   Nothing Scala              (     AnyVal AnyRef)
(1)
(2)
              -
•      (Invariant): C[T], C is invariant on T
       Tsub Tsup T                         C[Tsub] C[Tsup]    C[T]

•      (Covariant): C[+T], C is covariant on T
       Tsub T                C[Tsub]      C[T]

•      (Contrava&ant): C[‐T], C is contravariant on T
       Tsup T              C[Tsup]       C[T]



    Java                                                ?
    Scala                                        +/-
(2)
class Animal {}
class Dog extends Animal {}
class Fox extends Animal {}


•          Animal                      Animal
class Xian<T> {} // Java                        class Xian[+T]   //

void isAnimalXian(Xian<? extends Animal> in)    def isAnimalXian(in: Xian[Animal])

isAnimalXian(new Xian<Dog>())                   isAnimalXian(new Xian[Dog])
isAnimalXian(new Xian<Fox>())                   isAnimalXian(new Xian[Fox])




•          Dog                  Dog
class Xian<T> {} // Java                        class Xian[-T]   //

void isDogXian(Xian<? super Dog> in)            def isDogXian(in: Xian[Dog])

isDogXian(new Xian[Animal])                     isDogXian(new Xian[Animal])
vs
•
trait Pair[K, V] {                      class PairImpl extends Pair[Dog, Fox] {
  def get(key: K): V                      def get(key: Dog): Fox
  def set(key: K, value: V)               def put(key: Dog, value: Fox)
}                                       }

                                                 =>


•                                                 +                    +
trait Pair {                            class PairImpl extends Pair {
  type K // deferred type                 type K = Dog
  type V // deferred type                 type V = Fox

    def get(key: K): V                      def get(key: K): V
    def set(key: K, value: V)               def set(key: K, value: V)
}                                       }

                                            =>
•          =>     /
•          =>                 type StrToList = HashMap[String, List[String]]
Trait Structural Type
• Trait:     +              =>
• Structural Type:
                                            Type
trait Subject {
  type Observer = {def update(subject: Subject)} // type member

    private var observers = List[Observer]()   // field
    def addObserver(observer: Observer) = observers ::= observer
    def notifyObservers = observers foreach (_.update(this))
}

class Price(var value: Double) {def setValue(v: Double) = value = v}


                                                                  Java Interface
                                                                 Trait
val observablePrice = new Price(10) with Subject {
  override def setValue(v: Double) = {
    super.setValue(v); notifyObservers
  }
}

observablePrice.addObserver(new AnyRef {              update(Subject)      Observer
     def update(subject: Subject) {
       println("price changed")
    }
  })
Trait Self Type
•
    •                    Class                 Trait: OilPrice extends Price with Subject with Market with ....
    •
    •               (Self Type)


trait Subject {self: Price =>
  type Observer = {def update(subject: Price)} // type member

    private var observers = List[Observer]()   // field
                                                                                                                  this   Subject
    def addObserver(observer: Observer) = observers ::= observer
    def notifyObservers = observers foreach (_.update(this))
}

observablePrice.addObserver(new AnyRef { // only need a update(Any) method
     def update(subject: Price) {
       println("price changed to " + subject.value)
     }
  })

• Self Type:
    •       Trait
    •                                        class trait
    •       self       Trait super                   this      self                  self
    •                                Trait
        •
        •                                          class              trait (                   Class      )
apply
•           apply                   <instance>(args)   <instance>.apply(args)
•   apply                     Class
    class Price(var value: Int) {
      def apply() = value // ‘def apply = value’, without ’()’ is bad idea
    }

    object Price {
      def apply(v: Int) = new Price(v)
    }

    val p = Price(10)
    p           // Price@565f0e7d
    p()         // 10
    Price(10)() // 10

•   apply       Scala
    val list = List(1, 2, 3)         // List.apply[A](xs: A*)
    val array = Array("a", "b", "c") // Array.apply[T](xs: T*)
    val map = Map("a" -> 1,
                  "b" -> 2,
                  "c" -> 3) // MapFactory.apply[A, B](elems: (A, B)*)

    array(0) // array.apply(index): "a"
    map("a") // map.apply(key): 1
•   Java Switch                  (          Java7) Scala
    val str = "abcdef"
    str.toSeq match {
      case Seq('a', 'b', rest@_*) => println(rest) // cdef
      case _ => println("no match")
    }

    var any: Any = _
    any match {
      case "scala" | "java" => "string"
      case i: Int if i > 10 => "int > 10"
      case `str` => "abcdef"
      case _: String => "string type"
      case hd :: tail => "List"
      case _ => "other"
    }

    case class Address(coutry: String, city: String, street: String, no: Int)
    case class Person(name: String, age: Int, address: Address)

    val p = Person("Wang wu", 12, Address("China", "Beijing", "Chang'an", 10))

    p match {
      case Person(name, age, Address(coutry, city, street, no)) =>
        println(name + "|" + coutry + "|" + city + "|" + street + "|" + no)
    }
Scala
• Existential type (    Java   )
• Implicit type * (                              )
• val, var, lazy val (                       )
• Partial function * (                               )
• Primary constructor (                          apply)
• Accessor properties (Why getter, setter?        )
• XML Process (          )



*      DSL
(DSL     )
•   Actors
    class Ping(count: Int, pong: Actor) extends Actor {
      def act() {
        var pingsLeft = count - 1
        pong ! Ping
        while (true) {
          receive {                                                {...}
            case Pong =>
              if (pingsLeft % 1000 == 0)
                println("Pong”)
              if (pingsLeft > 0) {
                pong ! Ping
                pingsLeft -= 1
              } else {
                pong ! Stop
                exit()
              }}}}}
•   Bill Venners scalatest
    class StackSpec extends FlatSpec with ShouldMatchers {

        "A Stack" should "pop values in last-in-first-out order" in {
          val stack = new Stack[Int]
          stack.push(1)
          stack.push(2)
          stack.pop() should equal (2)                          should
          stack.pop() should equal (1)
        }

        it should "throw NoSuchElementException if an empty stack is popped" in {
          val emptyStack = new Stack[String]
          evaluating { emptyStack.pop() } should produce [NoSuchElementException]
        }
    }
Scala                   Java

Scala Java
• Scala            Java
   • Array
• Scala                Java       Java
   •          object
• Scala
   • Actors   Packrat Parser




                          Scala
Scala        Java


• Scala
•       Java         Scala(    nio )
•       Scala   (   liftweb)
• IDE
IDE

• IntelliJ Idea
  •5
  •

• Eclipse
  •       Sean McDirmid
  •       1              (Miles Sabin)
  • Scala             Martin IDE


• NetBeans
  •                (dcaoyuan)
  • 2007   LL(K)
  • 2008         PEGs
  • 2008         Scala              Hacking NetBeans Innovation Grant
  • 2009 8           Scala    Scala             Martin IDE
IDE               -NetBeans
•
    •
    •
    •
    •
    •
    •
    •
    •
    •
    •         HTML
    •
    •
    • Java/Scala
    •
    •            import
    •
    •
    • Maven
•
    • NetBeans 6.7.x                     7000
    • NetBeans 6.8m2            Scala-2.8.0     beta
       http://wiki.netbeans.org/Scala68v1
Scala for NetBeans
Q&A

More Related Content

PDF
Scala in Places API
Łukasz Bałamut
 
PDF
A bit about Scala
Vladimir Parfinenko
 
PDF
Scala for Jedi
Vladimir Parfinenko
 
KEY
Scala for ruby programmers
tymon Tobolski
 
PPT
SDC - Einführung in Scala
Christian Baranowski
 
PDF
Scala 2013 review
Sagie Davidovich
 
PPTX
Practically Functional
djspiewak
 
PDF
Scala: Object-Oriented Meets Functional, by Iulian Dragos
3Pillar Global
 
Scala in Places API
Łukasz Bałamut
 
A bit about Scala
Vladimir Parfinenko
 
Scala for Jedi
Vladimir Parfinenko
 
Scala for ruby programmers
tymon Tobolski
 
SDC - Einführung in Scala
Christian Baranowski
 
Scala 2013 review
Sagie Davidovich
 
Practically Functional
djspiewak
 
Scala: Object-Oriented Meets Functional, by Iulian Dragos
3Pillar Global
 

What's hot (20)

PDF
Scala for Java Programmers
Eric Pederson
 
ODP
1.2 scala basics
futurespective
 
PDF
High Wizardry in the Land of Scala
djspiewak
 
PDF
Scala collections api expressivity and brevity upgrade from java
IndicThreads
 
PPTX
Scala for curious
Tim (dev-tim) Zadorozhniy
 
ODP
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
Sanjeev_Knoldus
 
KEY
Scalaz
mpilquist
 
PDF
Scala Intro
Paolo Platter
 
PPTX
Practical scalaz
oxbow_lakes
 
PDF
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kirill Rozov
 
PPTX
All about scala
Yardena Meymann
 
PDF
Workshop Scala
Bert Van Vreckem
 
PDF
Scala
Sven Efftinge
 
PDF
Scala for Java Developers - Intro
David Copeland
 
PPT
Scala - brief intro
Razvan Cojocaru
 
PPTX
Joy of scala
Maxim Novak
 
PDF
Introduction to Scala for Java Developers
Michael Galpin
 
PDF
Stepping Up : A Brief Intro to Scala
Derek Chen-Becker
 
PDF
Scala jargon cheatsheet
Ruslan Shevchenko
 
PPTX
Scala Back to Basics: Type Classes
Tomer Gabel
 
Scala for Java Programmers
Eric Pederson
 
1.2 scala basics
futurespective
 
High Wizardry in the Land of Scala
djspiewak
 
Scala collections api expressivity and brevity upgrade from java
IndicThreads
 
Scala for curious
Tim (dev-tim) Zadorozhniy
 
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
Sanjeev_Knoldus
 
Scalaz
mpilquist
 
Scala Intro
Paolo Platter
 
Practical scalaz
oxbow_lakes
 
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kirill Rozov
 
All about scala
Yardena Meymann
 
Workshop Scala
Bert Van Vreckem
 
Scala for Java Developers - Intro
David Copeland
 
Scala - brief intro
Razvan Cojocaru
 
Joy of scala
Maxim Novak
 
Introduction to Scala for Java Developers
Michael Galpin
 
Stepping Up : A Brief Intro to Scala
Derek Chen-Becker
 
Scala jargon cheatsheet
Ruslan Shevchenko
 
Scala Back to Basics: Type Classes
Tomer Gabel
 
Ad

Similar to Scala-对Java的修正和超越 (20)

PDF
ハイブリッド言語Scalaを使う
bpstudy
 
KEY
ddd+scala
潤一 加藤
 
PPT
An introduction to scala
Mohsen Zainalpour
 
PDF
Scala Paradigms
Tom Flaherty
 
PDF
Scala Bootcamp 1
Knoldus Inc.
 
ODP
2.1 recap from-day_one
futurespective
 
ODP
Introducing scala
Meetu Maltiar
 
PDF
Scala vs Java 8 in a Java 8 World
BTI360
 
PDF
Getting Started With Scala
Meetu Maltiar
 
PDF
Getting Started With Scala
Xebia IT Architects
 
PDF
Scala at GenevaJUG by Iulian Dragos
GenevaJUG
 
KEY
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Hiroki Mizuno
 
KEY
SacalaZa #1
Hiroki Mizuno
 
ODP
1.2 scala basics
wpgreenway
 
PDF
Introduction to Scala
Brian Hsu
 
PDF
Introduction to Scala
Aleksandar Prokopec
 
PDF
Scala - core features
Łukasz Wójcik
 
PPT
Scala presentation by Aleksandar Prokopec
Loïc Descotte
 
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
ハイブリッド言語Scalaを使う
bpstudy
 
ddd+scala
潤一 加藤
 
An introduction to scala
Mohsen Zainalpour
 
Scala Paradigms
Tom Flaherty
 
Scala Bootcamp 1
Knoldus Inc.
 
2.1 recap from-day_one
futurespective
 
Introducing scala
Meetu Maltiar
 
Scala vs Java 8 in a Java 8 World
BTI360
 
Getting Started With Scala
Meetu Maltiar
 
Getting Started With Scala
Xebia IT Architects
 
Scala at GenevaJUG by Iulian Dragos
GenevaJUG
 
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Hiroki Mizuno
 
SacalaZa #1
Hiroki Mizuno
 
1.2 scala basics
wpgreenway
 
Introduction to Scala
Brian Hsu
 
Introduction to Scala
Aleksandar Prokopec
 
Scala - core features
Łukasz Wójcik
 
Scala presentation by Aleksandar Prokopec
Loïc Descotte
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
Ad

Recently uploaded (20)

PPTX
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
PDF
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
PDF
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
PDF
SparkLabs Primer on Artificial Intelligence 2025
SparkLabs Group
 
PDF
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
PPTX
Agile Chennai 18-19 July 2025 Ideathon | AI Powered Microfinance Literacy Gui...
AgileNetwork
 
PDF
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
PPTX
Agile Chennai 18-19 July 2025 | Emerging patterns in Agentic AI by Bharani Su...
AgileNetwork
 
PPTX
Dev Dives: Automate, test, and deploy in one place—with Unified Developer Exp...
AndreeaTom
 
PPTX
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
PPTX
Simple and concise overview about Quantum computing..pptx
mughal641
 
PDF
Accelerating Oracle Database 23ai Troubleshooting with Oracle AHF Fleet Insig...
Sandesh Rao
 
PDF
Brief History of Internet - Early Days of Internet
sutharharshit158
 
PDF
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
PPTX
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
PDF
Orbitly Pitch Deck|A Mission-Driven Platform for Side Project Collaboration (...
zz41354899
 
PDF
Tea4chat - another LLM Project by Kerem Atam
a0m0rajab1
 
PPTX
cloud computing vai.pptx for the project
vaibhavdobariyal79
 
PDF
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
PDF
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
SparkLabs Primer on Artificial Intelligence 2025
SparkLabs Group
 
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
Agile Chennai 18-19 July 2025 Ideathon | AI Powered Microfinance Literacy Gui...
AgileNetwork
 
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
Agile Chennai 18-19 July 2025 | Emerging patterns in Agentic AI by Bharani Su...
AgileNetwork
 
Dev Dives: Automate, test, and deploy in one place—with Unified Developer Exp...
AndreeaTom
 
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
Simple and concise overview about Quantum computing..pptx
mughal641
 
Accelerating Oracle Database 23ai Troubleshooting with Oracle AHF Fleet Insig...
Sandesh Rao
 
Brief History of Internet - Early Days of Internet
sutharharshit158
 
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
Orbitly Pitch Deck|A Mission-Driven Platform for Side Project Collaboration (...
zz41354899
 
Tea4chat - another LLM Project by Kerem Atam
a0m0rajab1
 
cloud computing vai.pptx for the project
vaibhavdobariyal79
 
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 

Scala-对Java的修正和超越

  • 1. Java Scala 2009.10 SD2China Caoyuan (NetBeans Dream Team Memeber) http://blogtrader.net/dcaoyuan/
  • 2. JVM 123.toByte "1".toInt true.toString • val compare = (x: Int, y: Int) => x > y compare(1, 2) // result: Boolean = false • Java sta&c ( ) Scala object object Dog { val whatever = "dog" // static field in Java } class Dog { def callWhatever = Dog.whatever }
  • 3. val compare = (x: Int, y: Int) => x > y list sortWith compare • class AComparator { def compare(x: Int, y: Int) = x > y } list sortWith (new AComparator).compare • object annonymous extends scala.Function2[Int, Int, Boolean] { override def apply(x: Int, y: Int) = x > y } list sortWith annonymous • sta&c object ( )
  • 4. (1) • 1.+(1) ”.” ”()” 1 + 1 1.>(0) 1 > 0 (1 > 0).&(2 > 1) (1 > 0) & 2 > 1 stack.push(10) stack push 10 stack.pop stack pop • stack push { {...} val a = 1 val b = 2 a + b } • def !@#%^&*-<=>?|~:/ = println("noop") def √(x: Double) = Math.sqrt(x) val Π = Math.Pi val r = √(9*Π) • ‘<’, ‘>’ ’[’ ‘]’
  • 5. (2) • for for (i <- List(1, 2)) { println(i) } List(1, 2) foreach {i => println(i)} for (i <- List(1, 2)) yield { i + 10 } List(1, 2) map {i => i + 10} • // synchronized is function call instead of keyword def check = synchronized { // isInstanceOf is function call instead of keyword 100.isInstanceOf[String] } • stack.pop.asInstanceOf[Int] // (Integer) stack.pop() in Java
  • 6. return val r1 = { // return 3 val a = 1 val b = 2 a + b } val r2 = if (true) 1 else 2 val r3 = // return (): Unit for (i <- List(1, 2)) { println(i) } val r4 = // return List(11, 12) for (i <- List(1, 2)) yield { i + 10 } val r5 = // return java.io.File try { val f = new File("afile") f } catch { case ex: IOException => null }
  • 7. Scala ( ) = OO + FP
  • 9. (1) • Scala Any Any JVM • JVM (byte, short, char, int, long, float, double, boolean) void • Scala (Byte, Short, Char, Int, Long, Float, Double, Boolean) Unit AnyVal • JVM AnyRef (java.lang.Object) // Scala, Array 8 val arrayOfListOfString = new Array[List[String]](10) val arrayOfAny: Array[_] = Array(1, 2) // Java List<String>[] arrayOfListOfString = new ArrayList<String>[10] • Scala Null Nothing • JVM null Null AnyRef • Nothing Scala ( AnyVal AnyRef)
  • 10. (1)
  • 11. (2) - • (Invariant): C[T], C is invariant on T Tsub Tsup T C[Tsub] C[Tsup] C[T] • (Covariant): C[+T], C is covariant on T Tsub T C[Tsub] C[T] • (Contrava&ant): C[‐T], C is contravariant on T Tsup T C[Tsup] C[T] Java ? Scala +/-
  • 12. (2) class Animal {} class Dog extends Animal {} class Fox extends Animal {} • Animal Animal class Xian<T> {} // Java class Xian[+T] // void isAnimalXian(Xian<? extends Animal> in) def isAnimalXian(in: Xian[Animal]) isAnimalXian(new Xian<Dog>()) isAnimalXian(new Xian[Dog]) isAnimalXian(new Xian<Fox>()) isAnimalXian(new Xian[Fox]) • Dog Dog class Xian<T> {} // Java class Xian[-T] // void isDogXian(Xian<? super Dog> in) def isDogXian(in: Xian[Dog]) isDogXian(new Xian[Animal]) isDogXian(new Xian[Animal])
  • 13. vs • trait Pair[K, V] { class PairImpl extends Pair[Dog, Fox] { def get(key: K): V def get(key: Dog): Fox def set(key: K, value: V) def put(key: Dog, value: Fox) } } => • + + trait Pair { class PairImpl extends Pair { type K // deferred type type K = Dog type V // deferred type type V = Fox def get(key: K): V def get(key: K): V def set(key: K, value: V) def set(key: K, value: V) } } => • => / • => type StrToList = HashMap[String, List[String]]
  • 14. Trait Structural Type • Trait: + => • Structural Type: Type trait Subject { type Observer = {def update(subject: Subject)} // type member private var observers = List[Observer]() // field def addObserver(observer: Observer) = observers ::= observer def notifyObservers = observers foreach (_.update(this)) } class Price(var value: Double) {def setValue(v: Double) = value = v} Java Interface Trait val observablePrice = new Price(10) with Subject { override def setValue(v: Double) = { super.setValue(v); notifyObservers } } observablePrice.addObserver(new AnyRef { update(Subject) Observer def update(subject: Subject) { println("price changed") } })
  • 15. Trait Self Type • • Class Trait: OilPrice extends Price with Subject with Market with .... • • (Self Type) trait Subject {self: Price => type Observer = {def update(subject: Price)} // type member private var observers = List[Observer]() // field this Subject def addObserver(observer: Observer) = observers ::= observer def notifyObservers = observers foreach (_.update(this)) } observablePrice.addObserver(new AnyRef { // only need a update(Any) method def update(subject: Price) { println("price changed to " + subject.value) } }) • Self Type: • Trait • class trait • self Trait super this self self • Trait • • class trait ( Class )
  • 16. apply • apply <instance>(args) <instance>.apply(args) • apply Class class Price(var value: Int) { def apply() = value // ‘def apply = value’, without ’()’ is bad idea } object Price { def apply(v: Int) = new Price(v) } val p = Price(10) p // Price@565f0e7d p() // 10 Price(10)() // 10 • apply Scala val list = List(1, 2, 3) // List.apply[A](xs: A*) val array = Array("a", "b", "c") // Array.apply[T](xs: T*) val map = Map("a" -> 1, "b" -> 2, "c" -> 3) // MapFactory.apply[A, B](elems: (A, B)*) array(0) // array.apply(index): "a" map("a") // map.apply(key): 1
  • 17. Java Switch ( Java7) Scala val str = "abcdef" str.toSeq match { case Seq('a', 'b', rest@_*) => println(rest) // cdef case _ => println("no match") } var any: Any = _ any match { case "scala" | "java" => "string" case i: Int if i > 10 => "int > 10" case `str` => "abcdef" case _: String => "string type" case hd :: tail => "List" case _ => "other" } case class Address(coutry: String, city: String, street: String, no: Int) case class Person(name: String, age: Int, address: Address) val p = Person("Wang wu", 12, Address("China", "Beijing", "Chang'an", 10)) p match { case Person(name, age, Address(coutry, city, street, no)) => println(name + "|" + coutry + "|" + city + "|" + street + "|" + no) }
  • 18. Scala • Existential type ( Java ) • Implicit type * ( ) • val, var, lazy val ( ) • Partial function * ( ) • Primary constructor ( apply) • Accessor properties (Why getter, setter? ) • XML Process ( ) * DSL
  • 19. (DSL ) • Actors class Ping(count: Int, pong: Actor) extends Actor { def act() { var pingsLeft = count - 1 pong ! Ping while (true) { receive { {...} case Pong => if (pingsLeft % 1000 == 0) println("Pong”) if (pingsLeft > 0) { pong ! Ping pingsLeft -= 1 } else { pong ! Stop exit() }}}}} • Bill Venners scalatest class StackSpec extends FlatSpec with ShouldMatchers { "A Stack" should "pop values in last-in-first-out order" in { val stack = new Stack[Int] stack.push(1) stack.push(2) stack.pop() should equal (2) should stack.pop() should equal (1) } it should "throw NoSuchElementException if an empty stack is popped" in { val emptyStack = new Stack[String] evaluating { emptyStack.pop() } should produce [NoSuchElementException] } }
  • 20. Scala Java Scala Java • Scala Java • Array • Scala Java Java • object • Scala • Actors Packrat Parser Scala
  • 21. Scala Java • Scala • Java Scala( nio ) • Scala ( liftweb) • IDE
  • 22. IDE • IntelliJ Idea •5 • • Eclipse • Sean McDirmid • 1 (Miles Sabin) • Scala Martin IDE • NetBeans • (dcaoyuan) • 2007 LL(K) • 2008 PEGs • 2008 Scala Hacking NetBeans Innovation Grant • 2009 8 Scala Scala Martin IDE
  • 23. IDE -NetBeans • • • • • • • • • • • HTML • • • Java/Scala • • import • • • Maven • • NetBeans 6.7.x 7000 • NetBeans 6.8m2 Scala-2.8.0 beta http://wiki.netbeans.org/Scala68v1
  • 25. Q&A