Scala - Uma Breve (breve mesmo) Introdução

  • 1,631 views
Uploaded on

Uma breve introdução a Scala, essa fantástica linguagem que venho estudando no último ano.

Uma breve introdução a Scala, essa fantástica linguagem que venho estudando no último ano.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,631
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
0
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Scala Uma breve(breve mesmo) introdução @paulosuzart
  • 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 :(
  • 15. Hierarquia x Linearidade
  • 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
  • 28. Comunidade/Livros www.scala-lang.org
  • 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>
  • 35. 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)
  • 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 >>)
  • 37. Exemplo
  • 38. Exemplo (métodos)
  • 39. Encontre o código do exemplo aqui: http://dl.getdropbox.com/u/180764/mycache/index.html
  • 40. Fim