SlideShare uma empresa Scribd logo
1 de 40
Scala
Uma breve(breve mesmo)
introdução
@paulosuzart
Bio do apresentador

Desenvolvedor Java Enterprise há 5 anos
    Atualmente atua como consultor
             Oracle | BEA

          Pode ser lido em:
      codemountain.wordpress.com
            blog.rasea.org
           stackoverflow.com
             @paulosuzart
Nesta apresentação
   História
   Apresentando Scala
   Funcional? Como assim?
   Quem usa?
   Comunidade/Livros/personalidades
   Ferramentas
   Exemplos
Agenda
   História <-
   Apresentando Scala
   Funcional? Como assim?
   Quem usa?
   Comunidade/Livros/personalidades
   Ferramentas
   Exemplos
História
   Nascida em 2001
   Por Martin Odersky
       Criador do compilador de
        referência Java
       Co-autor do Java Generics
   Influenciada por: Haskell, Erlang,
    OCaml, F#, C#, C, C ++, outras.
Saindo na frente

Enquanto o Java era lançado, Odersky
     apresentava PIZZA (1996).
            Generics +
      High-order Functions +
          Pattern Matching
Agenda
   História
   Apresentando Scala <-
   Funcional? Como assim?
   Quem usa?
   Comunidade/Livros/personalidades
   Ferramentas
   Exemplos
Apresentando Scala
   Linguagem de propósito geral
   Orientada a objetos e funcional,
    portanto HÍBRIDA.
   Pronta pra criação de DSL
   Extensível
   ”Roda” na JVM. Transparência com
    Java e tudo executável na JMV :)
Apresentando Scala
   Estática, com sabor de dinâmica                 (sem
    verbose)


            val name = quot;Felinoquot; // a string 
    Scala   val age = 23 // a Int
            def upper(s: String) = s toUpperCase
            val up = upper(name) // FELINO

            String name = quot;Joshuaquot;;
            Integer age = new Integer(8);
    Java    public String upper(final String s) {
               return s.toUpperCase();
            }
            String upper = upper(name);
Por que estática?
   Diminui a possibilidade de erros em
    Run-time
   Refactoring
   Documentação
   Manutenção
Apresentando Scala
   Compilada, mas com cara de script
         println(quot;Hello Acc, I'm a Scriptquot;)

         class Person(age: Int) {
           println(quot;My age is quot; + age)
         }

         val p = new Person(21)

         save as hello.scala and then

         $ scala hello.scala
         Hello Acc, I'm a Script
         My age is 21
Apresentando Scala
   if sempre ”ternários”
     val x = 21; val y 10
     val max = if (x > y) x else y
     max: Int = 21

   for podem retornar valor
     val numbers = List(1,2,3,4)
     val even =  for {
                    i ← numbers
                    if (i % 2 == 0)
                 } yield i
     even: List[Int] = List(2, 4)
Apresentando Scala
   Operadores são métodos
    val sum = 1.+(2) // 1 + 2

   Tuplas
    val (name, age) = (”Felino”, 24)
    name: java.langString = Felino
    age: Ing = 24
Apresentando Scala
   Traits   (principal unidade de reuso)

abstract class Animal { def walk : String } 
trait Injury extends Animal {                       
     abstract override def walk = super.walk + 
                 quot; But I'm injured :( quot;
}
class Dog extends Animal { 
  def walk = quot;I'm walking.quot; }
val goodDog = new Dog
goodDog.walk // I'm Walking
val badDog = new Dog with Injury
badDog walk // I'm Walking. But I'm injured :(
Hierarquia x Linearidade
Agenda
   História
   Apresentando Scala
   Funcional? Como assim? <-
   Quem usa?
   Comunidade/Livros/personalidades
   Ferramentas
   Exemplos
Funcional? Como assim?


      [...] style of programming that
              emphasizes quot;first-classquot;
            functions that are quot;purequot;.
                  R. Mark Volkmann
Alonzo Church - 1930
  Lambda Calculus
      λ x. x + 2 
      f(x) = x + 2
   Imutabilidade
   Clojure
   Currying
   Funções são cidadãs de primeiro nível
   Funções de alto nível
   Pattern Matching
   Lazy evaluation
Imutabilidade
    val p = new Person
    p = new person

    <console>:6: error: reassignment to val
           p = new Person



    Menor quantidade de re-atribuições =   menor   possibilidade de erros
   O estado não muda no decorrer do tempo
   2 threads não podem alterar o estado de um objeto, ele é imutável
   Concorrência fácil


                         Mas use com responsabilidade
Clojure
def makeOlder(p: Person) = println(p.age + more)

   #Fail! What is more? Tentemos outra vez:
val more = 10 //isso está fora da função
def makeOlder(p: Person) = println(p.age + more)
   #Win! Estamos fechando (closing/clojuring) o valor
    capturado de more

   Flexibilidade no código, novas formas de resolver
    velhos problemas

   Elegante!
Currying
    Funções aplicadas a multiplas listas de argumentos

    Facilita criação novos controles de código

    Loan pattern fortemente baseado em Currying
    def useAndClose[T](closeable : {def close() : Unit}*)(op: => T) : T = {  
    try { op }  
    finally { for (c <­ closeable if c!= null) c close } } 
    //pode ser usada em seu Connection, ResultSet e CallableStatement assim:
    val myInfo = useAndClose(conn, cs, rs) {  
             cs.registerOutParameter(1, Types.VARCHAR)  
             cs getString 1
         } 
    //Recupera a informação do banco e ainda fecha os recursos. :)
Funções são cidadãs de primeiro nível

   Tudo é uma função
   Funções tem literais e valores
   Uma vairável pode armazenar uma função
    val pow = (x: Int) => x*x
    pow(2) // 4


   Funções recebem funções
    def pow(x: Int)(op : Int => Int) = op(x) * op(x)
    Pow(2){ 3 + _ } // executa a função de soma 3 + 2 e 
                    // eleva ao quadrado
Funções de alto nível
   Scala Lists possui um grande conjunto de funções
    de alto nível

   Recebem funções como parâmetro e executam
    algum processamento

   Alto grau de flexibilidade

   Inspira criatividade
         numbers foreach (x => println(x*x))
         println( numbers reduceLeft(_ + _) )
Pattern Match
   Um dos aspectos mais interessantes da linguagem

   Pode ser comparado a um case Java para qualquer
    tipo de objeto, mas não é

   Exige dedicação para entendimento e bom uso
    //fatorial com pattern match
    def fac(x : Int) : Int = x match {
           case 0 => 1
           case xpto => xpto * fac(xpto ­ 1) 
          }    

                         //atribuições multiplas com pattern 
                         match
                         val p = new Person(18, quot;Gabrielquot;)
                         val (age, name) = (p.age, p.name)
                         age: Int = 18
                         name: String = Gabriel
E tem muito mais, Acredite!
Agenda
   História
   Apresentando Scala
   Funcional? Como assim?
   Quem usa?
   Comunidade/Livros/personalidades <-

   Ferramentas
   Exemplos
Comunidade/Livros



  www.scala-lang.org
Personalidades
Jonas Bonér - @jboner         Robey - @robey
jonasboner.com                robey.lag.net
BEA (Jrockit) :: Terracotta   Twitter

Alex Miller - @puredanger     Ted Neward
tech.puredanger.com           blogs.tedneward.com
BEA :: Terracotta             IBM Articles

Alex Payne - @al3x            Paulo Suzart - @paulosuzart
al3x.net                      codemountain in wordpress
Twitter                       Accurate
Agenda
   História
   Apresentando Scala
   Funcional? Como assim?
   Quem usa?
   Comunidade/Livros/personalidades <-

   Ferramentas
   Exemplos
Ferramentas         (algumas)




   lift web (MVC)
   Scala/xml
   Maven-scala-pluguin
   ScalaTest
   InteliJ/NetBeas/Eclipse plugin
   sbt – Simple Build Tool
   Scala X-Ray
Agenda
   História
   Apresentando Scala
   Funcional? Como assim?
   Quem usa?
   Comunidade/Livros/personalidades <-

   Ferramentas
   Exemplos
Exemplos        (high-order functions)


val numbers = List.range(1,6)
numbers: List[Int] = List(1,2,3,4,5)
numbers foreach (x => print(x*x))
//1 4 9 16 25
 numbers filter (_ > 3) foreach println
// 4 5
println { 
  numbers reduceLeft(_+_)
  }
// 15
Exemplos (inline XML)
class Person(val name : String, val age : Int)
val p = new Person(quot;Felinoquot;, 24)

val xml = 
  <person><name>{p.name}</name><age>{p.age}</age>
  </person>

xml: scala.xml.Elem = 
<person>
   <name>Felino</name>
   <age>24</age>
</person>
Exemplos (XPath)
val document = 
<persons>
 <person><name>Paulo</name><age>26</age></person>
 <person><name>Caro</name><age>18</age></person>
</persons>

for { p <­ document  quot;personquot;
      name <­ p  quot;namequot;
      age <­ p quot;agequot;
      nameV = name.text
      ageV = Integer.parseInt(age.text) 
} println (quot;Name: quot;+ nameV +quot;, age: quot;+ ageV)
Exemplo prático
   Gerenciador de Cache (OSCache)
   Consulta o cache e atualiza se entrada não
    existe (método <<)
   Consulta o cache e retorna null se entrada
    não existe (método <<-)
   Insere valores retornados de qualquer
    função (método >>)
Exemplo
Exemplo (métodos)
Encontre o código do exemplo aqui:




http://dl.getdropbox.com/u/180764/mycache/index.html
Fim

Mais conteúdo relacionado

Semelhante a Introdução breve à Scala em

Desenvolvimento em .Net - Boas Praticas De Desenvolvimento
Desenvolvimento em .Net - Boas Praticas De DesenvolvimentoDesenvolvimento em .Net - Boas Praticas De Desenvolvimento
Desenvolvimento em .Net - Boas Praticas De DesenvolvimentoVitor Silva
 
JavaScript ninja com jQuery
JavaScript ninja com jQueryJavaScript ninja com jQuery
JavaScript ninja com jQueryReinaldo Junior
 
Introdução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsIntrodução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsJulio Betta
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorFelipe Hummel
 
Migrando de Oracle para PostgreSQL
Migrando de Oracle para PostgreSQLMigrando de Oracle para PostgreSQL
Migrando de Oracle para PostgreSQLFernando Ike
 
Introdução Programação Funcional
Introdução Programação FuncionalIntrodução Programação Funcional
Introdução Programação FuncionalNatan Mai
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011JogosUnisinos
 
PHP Day - PHP para iniciantes
PHP Day - PHP para iniciantesPHP Day - PHP para iniciantes
PHP Day - PHP para iniciantesAlmir Mendes
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUACândido Sales Gomes
 
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)Julio Betta
 

Semelhante a Introdução breve à Scala em (20)

Desenvolvimento em .Net - Boas Praticas De Desenvolvimento
Desenvolvimento em .Net - Boas Praticas De DesenvolvimentoDesenvolvimento em .Net - Boas Praticas De Desenvolvimento
Desenvolvimento em .Net - Boas Praticas De Desenvolvimento
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
JavaScript ninja com jQuery
JavaScript ninja com jQueryJavaScript ninja com jQuery
JavaScript ninja com jQuery
 
Introdução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsIntrodução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on Rails
 
Comandos e expressões
Comandos e expressõesComandos e expressões
Comandos e expressões
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitor
 
Java para iniciantes
Java para iniciantesJava para iniciantes
Java para iniciantes
 
Migrando de Oracle para PostgreSQL
Migrando de Oracle para PostgreSQLMigrando de Oracle para PostgreSQL
Migrando de Oracle para PostgreSQL
 
Palestra Ruby
Palestra RubyPalestra Ruby
Palestra Ruby
 
JavaFX SestInfo 2010
JavaFX SestInfo 2010JavaFX SestInfo 2010
JavaFX SestInfo 2010
 
Introdução Programação Funcional
Introdução Programação FuncionalIntrodução Programação Funcional
Introdução Programação Funcional
 
Java script1
Java script1Java script1
Java script1
 
Tema 2 | Linguagem PHP Básico (I)
Tema 2 | Linguagem PHP Básico (I)Tema 2 | Linguagem PHP Básico (I)
Tema 2 | Linguagem PHP Básico (I)
 
Linguagem R
Linguagem RLinguagem R
Linguagem R
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
PHP Day - PHP para iniciantes
PHP Day - PHP para iniciantesPHP Day - PHP para iniciantes
PHP Day - PHP para iniciantes
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA
 
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
 

Introdução breve à Scala em

  • 2. Bio do apresentador Desenvolvedor Java Enterprise há 5 anos Atualmente atua como consultor Oracle | BEA Pode ser lido em: codemountain.wordpress.com blog.rasea.org stackoverflow.com @paulosuzart
  • 3. Nesta apresentação  História  Apresentando Scala  Funcional? Como assim?  Quem usa?  Comunidade/Livros/personalidades  Ferramentas  Exemplos
  • 4. Agenda  História <-  Apresentando Scala  Funcional? Como assim?  Quem usa?  Comunidade/Livros/personalidades  Ferramentas  Exemplos
  • 5. História  Nascida em 2001  Por Martin Odersky  Criador do compilador de referência Java  Co-autor do Java Generics  Influenciada por: Haskell, Erlang, OCaml, F#, C#, C, C ++, outras.
  • 6. Saindo na frente Enquanto o Java era lançado, Odersky apresentava PIZZA (1996). Generics + High-order Functions + Pattern Matching
  • 7. Agenda  História  Apresentando Scala <-  Funcional? Como assim?  Quem usa?  Comunidade/Livros/personalidades  Ferramentas  Exemplos
  • 8. Apresentando Scala  Linguagem de propósito geral  Orientada a objetos e funcional, portanto HÍBRIDA.  Pronta pra criação de DSL  Extensível  ”Roda” na JVM. Transparência com Java e tudo executável na JMV :)
  • 9. Apresentando Scala  Estática, com sabor de dinâmica (sem verbose) val name = quot;Felinoquot; // a string  Scala val age = 23 // a Int def upper(s: String) = s toUpperCase val up = upper(name) // FELINO String name = quot;Joshuaquot;; Integer age = new Integer(8); Java public String upper(final String s) { return s.toUpperCase(); } String upper = upper(name);
  • 10. Por que estática?  Diminui a possibilidade de erros em Run-time  Refactoring  Documentação  Manutenção
  • 11. Apresentando Scala  Compilada, mas com cara de script println(quot;Hello Acc, I'm a Scriptquot;) class Person(age: Int) {   println(quot;My age is quot; + age) } val p = new Person(21) save as hello.scala and then $ scala hello.scala Hello Acc, I'm a Script My age is 21
  • 12. Apresentando Scala  if sempre ”ternários” val x = 21; val y 10 val max = if (x > y) x else y max: Int = 21  for podem retornar valor val numbers = List(1,2,3,4) val even =  for { i ← numbers if (i % 2 == 0) } yield i even: List[Int] = List(2, 4)
  • 13. Apresentando Scala  Operadores são métodos val sum = 1.+(2) // 1 + 2  Tuplas val (name, age) = (”Felino”, 24) name: java.langString = Felino age: Ing = 24
  • 14. Apresentando Scala  Traits (principal unidade de reuso) abstract class Animal { def walk : String }  trait Injury extends Animal {                             abstract override def walk = super.walk +  quot; But I'm injured :( quot; } class Dog extends Animal {  def walk = quot;I'm walking.quot; } val goodDog = new Dog goodDog.walk // I'm Walking val badDog = new Dog with Injury badDog walk // I'm Walking. But I'm injured :(
  • 16. Agenda  História  Apresentando Scala  Funcional? Como assim? <-  Quem usa?  Comunidade/Livros/personalidades  Ferramentas  Exemplos
  • 17. Funcional? Como assim? [...] style of programming that emphasizes quot;first-classquot; functions that are quot;purequot;. R. Mark Volkmann
  • 18. Alonzo Church - 1930 Lambda Calculus λ x. x + 2  f(x) = x + 2
  • 19. Imutabilidade  Clojure  Currying  Funções são cidadãs de primeiro nível  Funções de alto nível  Pattern Matching  Lazy evaluation
  • 20. Imutabilidade val p = new Person p = new person <console>:6: error: reassignment to val        p = new Person  Menor quantidade de re-atribuições = menor possibilidade de erros  O estado não muda no decorrer do tempo  2 threads não podem alterar o estado de um objeto, ele é imutável  Concorrência fácil Mas use com responsabilidade
  • 21. Clojure def makeOlder(p: Person) = println(p.age + more)  #Fail! What is more? Tentemos outra vez: val more = 10 //isso está fora da função def makeOlder(p: Person) = println(p.age + more)  #Win! Estamos fechando (closing/clojuring) o valor capturado de more  Flexibilidade no código, novas formas de resolver velhos problemas  Elegante!
  • 22. Currying  Funções aplicadas a multiplas listas de argumentos  Facilita criação novos controles de código  Loan pattern fortemente baseado em Currying def useAndClose[T](closeable : {def close() : Unit}*)(op: => T) : T = {   try { op }   finally { for (c <­ closeable if c!= null) c close } }  //pode ser usada em seu Connection, ResultSet e CallableStatement assim: val myInfo = useAndClose(conn, cs, rs) {            cs.registerOutParameter(1, Types.VARCHAR)            cs getString 1      }  //Recupera a informação do banco e ainda fecha os recursos. :)
  • 23. Funções são cidadãs de primeiro nível  Tudo é uma função  Funções tem literais e valores  Uma vairável pode armazenar uma função val pow = (x: Int) => x*x pow(2) // 4  Funções recebem funções def pow(x: Int)(op : Int => Int) = op(x) * op(x) Pow(2){ 3 + _ } // executa a função de soma 3 + 2 e   // eleva ao quadrado
  • 24. Funções de alto nível  Scala Lists possui um grande conjunto de funções de alto nível  Recebem funções como parâmetro e executam algum processamento  Alto grau de flexibilidade  Inspira criatividade numbers foreach (x => println(x*x)) println( numbers reduceLeft(_ + _) )
  • 25. Pattern Match  Um dos aspectos mais interessantes da linguagem  Pode ser comparado a um case Java para qualquer tipo de objeto, mas não é  Exige dedicação para entendimento e bom uso //fatorial com pattern match def fac(x : Int) : Int = x match {        case 0 => 1 case xpto => xpto * fac(xpto ­ 1)        }     //atribuições multiplas com pattern  match val p = new Person(18, quot;Gabrielquot;) val (age, name) = (p.age, p.name) age: Int = 18 name: String = Gabriel
  • 26. E tem muito mais, Acredite!
  • 27. Agenda  História  Apresentando Scala  Funcional? Como assim?  Quem usa?  Comunidade/Livros/personalidades <-  Ferramentas  Exemplos
  • 29. Personalidades Jonas Bonér - @jboner Robey - @robey jonasboner.com robey.lag.net BEA (Jrockit) :: Terracotta Twitter Alex Miller - @puredanger Ted Neward tech.puredanger.com blogs.tedneward.com BEA :: Terracotta IBM Articles Alex Payne - @al3x Paulo Suzart - @paulosuzart al3x.net codemountain in wordpress Twitter Accurate
  • 30. Agenda  História  Apresentando Scala  Funcional? Como assim?  Quem usa?  Comunidade/Livros/personalidades <-  Ferramentas  Exemplos
  • 31. Ferramentas (algumas)  lift web (MVC)  Scala/xml  Maven-scala-pluguin  ScalaTest  InteliJ/NetBeas/Eclipse plugin  sbt – Simple Build Tool  Scala X-Ray
  • 32. Agenda  História  Apresentando Scala  Funcional? Como assim?  Quem usa?  Comunidade/Livros/personalidades <-  Ferramentas  Exemplos
  • 33. Exemplos (high-order functions) val numbers = List.range(1,6) numbers: List[Int] = List(1,2,3,4,5) numbers foreach (x => print(x*x)) //1 4 9 16 25  numbers filter (_ > 3) foreach println // 4 5 println {  numbers reduceLeft(_+_) } // 15
  • 34. Exemplos (inline XML) class Person(val name : String, val age : Int) val p = new Person(quot;Felinoquot;, 24) val xml =  <person><name>{p.name}</name><age>{p.age}</age> </person> xml: scala.xml.Elem =  <person> <name>Felino</name>    <age>24</age> </person>
  • 36. Exemplo prático  Gerenciador de Cache (OSCache)  Consulta o cache e atualiza se entrada não existe (método <<)  Consulta o cache e retorna null se entrada não existe (método <<-)  Insere valores retornados de qualquer função (método >>)
  • 39. Encontre o código do exemplo aqui: http://dl.getdropbox.com/u/180764/mycache/index.html
  • 40. Fim