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
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 >>)