SlideShare uma empresa Scribd logo
Scala
Unindo programação funcional
e orientação a objetos
Felipe Hummel
Quem?
• Graduação (2008) e Mestrado (2011) pela UFAM
• NewsMonitor
• Desde 2012, morando em São Paulo nos últimos 2 anos
• Site profissional para monitoramento de notícias em tempo real
• 170M de notícias
• 5M/mês
• ~30K linhas de código Scala (2 Devs back-end)
• Maiores desafios estão na coleta, processamento e busca de notícias
Scala, o quê?
• Relativamente “nova" (2004) começando a ganhar tração
depois de 2010
• Linguagem com tipagem forte e estática (“mais" do que
outras)
• “Multiparadigma”: funcional + OO
• Open Source
• Compila para bytecode da JVM (Java Virtual Machine)
• Facilmente interoperável com código e libs Java
Scala, quem usa?
Scala, quem usa?
Scala, por quê?
• Consegue ser roazavelmente familiar mas ainda introduz conceitos
funcionais que mudam a forma como programamos
• Concisão de código sem perca de legibilidade
• Inferência de tipos (local, diferente de Haskell/ML)
• Coleções muito ricas em funcionalidades
• 90% da rotina é lidar com coleções de objetos
• Preferência por imutabilidade
• Quase tudo faz parte da biblioteca e não é sintaxe especial da linguagem
• Poder para expressar muita coisa
Scala
sudo apt-get install scala
Val e Var
val soma = 1 + 1

Val e Var
val soma = 1 + 1

soma = 10 //error: reassignment to val
Val e Var
var soma = 1 + 1

Val e Var
var soma = 1 + 1

soma = soma + 1 //OK!
Inferência de tipos
val soma = 1 + 1

Inferência de tipos


val soma: Int = 1 + 1

soma.substring(0)

//error: value substring is not a member of Int
Inferência de tipos


val soma = 1 + 1

soma.substring(0)

//error: value substring is not a member of Int
Inferência de tipos
val soma: Int = 1 + 1

val nome: String = “teste"

val lista: List[String] = List(“teste”)

Inferência de tipos
val soma = 1 + 1

val nome = “teste"

val lista = List(“teste”)

Funções


def add1(n: Int) = n + 1

// ^ inferência de tipo de retorno
Funções


def add1(n: Int): Int = n + 1

// ^ tipo de retorno explícito
Funções


def add1(n: Int): Int = { 

println(“adicionando 1”)

n + 1 // última expressão: retorno automático

}

Funções anônimas


val f = (n: Int) => n + 1 

// ^ inferindo tipo de retorno

f(1) // retorna 2





val g: (Int => Int) = n => n * 2

val h: (Int => Int) = _ * 2

Funções anônimas


val f = (n: Int) => n + 1 

val g: (Int => Int) = n => n * 2



val fg = f.andThen(g) 

fg(10) // retorna 22

Lazy vals
lazy val usuários = todosUsuarios()

// todosUsuarios() ainda não foi chamada!!



val result = usuarios

// todosUsuarios() foi chamada agora



println(usuarios)// não precisou recomputar
Classes
class Curso(id: Int, nome: String)

class Aluno(id: Int, curso: Curso, idade: Int)
Classes
// ISSO NÃO É SCALA CORRETO! 

class Curso {

private val id: Int

private val nome: String

def constructor(_id: Int, _nome: String) {

id = _id

nome = _nome

}

}
Classes
// ISSO É SCALA CORRETO! 

class Curso(id: Int, nome: String)









Classes




class Curso(id: Int, nome: String)



val computacao = new Curso(1,“Computação”)



println(computacao.nome) 

//error: value nome is not a member of Curso

// nome não é acessível publicamente
Classes




class Curso(val id: Int, val nome: String)



val computacao = new Curso(1,“Computação”)



println(computacao.nome) 

// Computação

Classes




class Curso(id: Int, nome: String) {

def comoString(): String =

s”Curso($id, $nome)“

}



val computacao = new Curso(1,“Computação”)



println(computacao.comoString()) 

// Curso(1, Computação)
case classes










case class Curso(id: Int, nome: String)



val computacao = Curso(1,“Computação”)



println(computacao) 

// Curso(1, Computação)
case classes


// implementa pra mim:

// - toString() bonitinho

// - equals() e hashCode()

// - atributos são públicos e imutáveis por padrão

// - não precisa do new para instanciar objeto

case class Curso(id: Int, nome: String)



val computacao = Curso(1,“Computação”)



println(computacao) 

// Curso(1, Computação)
public class Person {

private final String firstName;

private final String lastName;
String getFirstName() { return firstName; }

String getLastName() { return lastName; }



public Person(String first, String last) {

this.firstName = first;

this.lastName = last;

}



public int hashCode() {

return goodHashCode(firstName, lastName);

}

public boolean equals(Object o) {

if ( this == aThat ) return true;

if ( !(aThat instanceof Person) ) return false;

Person that = (Person)aThat;

return EqualsUtil.areEqual(this.firstName, that.firstName) &

EqualsUtil.areEqual(this.lastName, that.lastName);

}

}
case class Person(firstName: String, lastName: String)
objects
// um "singleton"

object ContadorGlobal {

var contador = 0

def incrementaERetorna() = {

contador += 1

contador

}

}

// apesar do exemplo, por favor não criem vars globais :)

ContadorGlobal.incrementaERetorna() // 1

ContadorGlobal.incrementaERetorna() // 2

ContadorGlobal.incrementaERetorna() // 3



parâmetros de tipo
(generics)
val cursos: List[String] =

List(“Computação”, “Matemática”, "Física")





val cursosPorNome: Map[String, Int] =

Map("Computação" -> 1234,

"Matemática" -> 423,

"Física" -> 5322,

"Biologia" -> 1312)

Coleções!
Mão na massa
Scala é isso
80% de Scala é isso
Scala
mudou a forma
como programamos
Parar de acessar
o que não está lá
• NullPointerException (Java)
• Segmentation Fault (C/C++)
• undefined is not a function (Javascript)
• AttributeError: 'NoneType' object has no
attribute (Python)
• Call to a member function on a non-object
(PHP)
Parar de acessar
o que não está lá
• NullPointerException (Java)
• undefined is not a function (Javascript)
• AttributeError: 'NoneType' object has no
attribute (Python)
• Call to a member function on a non-object
(PHP)
Null Pointer Exc… NÃO
• NullPointerException (Java)
• undefined is not a function (Javascript)
• AttributeError: 'NoneType' object has no
attribute (Python)
• Call to a member function on a non-object
(PHP)
SCALA
NÃO TEM
!!!!!!!!!
Null Pointer Exc… NÃO
• Uso de Option[MeuTipo] quando necessário
Tipagem Estática!
• Linguagens com tipagem estáticas pegaram fama de serem
verbosas
• Não necessariamente
• Scala consegue ser tão concisa quanto as linguagens dinâmicas
• Tendência de adicionar tipos opcionais nas linguagens
dinâmicas
• Javascript, PHP, Python
• Difícil viver sem um compilador me ajudando
Imutabilidade
• Coisas a menos pra guardar na sua cabeça
• Não me preocupo se alguém pode ou vai mudar
meu objeto
• Você pode passar objetos imutáveis pra lá e pra cá de
boa
• Thread-safe por padrão
Scala é a melhor coisa do
mundo?
Scala é a melhor coisa do
mundo?
A minha
linguagem/framework/biblioteca
não é a melhor possível
Mais conciso e expressivo
que Scala é impossível
Mais conciso e expressivo
que Haskell é impossível
Programação é sempre um
comando seguido do outro
Programação pode ser só
(funções (chamando (funções ‘!’)))
em Clojure
Ou damos free() na mão
ou usamos Garbage Collector
Ou damos free() na mão
ou usamos Garbage Collector
ou usamos Rust
e o seu sistema de ownership
Sempre dá pra melhorar
Obrigado!
Dúvidas?
@felipehummel
felipehummel@gmail.com

Mais conteúdo relacionado

PDF
Objetos Pythonicos - compacto
PDF
Orientação a objetos em Python (compacto)
PDF
Iteraveis e geradores
PDF
Três anos de Scala no NewsMonitor
PDF
Swift em 45 minutos - TDC Sao Paulo 2014
PDF
Orientação a Objetos em Python
PDF
JavaScript: agora é sério
PDF
Iteráveis e geradores (versão RuPy)
Objetos Pythonicos - compacto
Orientação a objetos em Python (compacto)
Iteraveis e geradores
Três anos de Scala no NewsMonitor
Swift em 45 minutos - TDC Sao Paulo 2014
Orientação a Objetos em Python
JavaScript: agora é sério
Iteráveis e geradores (versão RuPy)

Mais procurados (20)

PDF
Iteraveis e geradores em Python
PDF
Python e django na prática
PDF
Programação orientada a objetos - IV
PDF
Javafx Introdução
PDF
Python para quem sabe Python (aula 2)
PDF
Programação orientada a objetos – III
PPT
Java Básico
PDF
Programando para web com python - Introdução a Python
PDF
Python: a primeira mordida
PDF
Introdução ao paradigma funcional com scala
PPTX
Javascript para CSharpers 4 - POO
PDF
Migrando pra Scala
ODP
Python: programação divertida novamente
DOCX
Java para iniciantes
KEY
Desenvolvimento iOS - Aula 1
PDF
JavaScript for Beginners
PDF
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
PDF
Arduino e Python: Do It Yourself
PDF
Programando com Python
PDF
Aprendendo ruby
Iteraveis e geradores em Python
Python e django na prática
Programação orientada a objetos - IV
Javafx Introdução
Python para quem sabe Python (aula 2)
Programação orientada a objetos – III
Java Básico
Programando para web com python - Introdução a Python
Python: a primeira mordida
Introdução ao paradigma funcional com scala
Javascript para CSharpers 4 - POO
Migrando pra Scala
Python: programação divertida novamente
Java para iniciantes
Desenvolvimento iOS - Aula 1
JavaScript for Beginners
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
Arduino e Python: Do It Yourself
Programando com Python
Aprendendo ruby
Anúncio

Semelhante a Scala: unindo programação funcional e orientação a objetos (20)

PDF
Aprendendo Kotlin na Prática
PDF
Scala - Uma Breve (breve mesmo) Introdução
PPTX
Scala: Programação OO, Funcional e Concorrente na JVM
PPTX
Scala java7
PDF
Turbinando o desenvolvimento Android com Kotlin
PDF
Scala: Linguagem Promissora e Funcional
PPTX
Kotlin: conhecendo features de uma linguagem moderna
PDF
Padrões de projeto em linguagens funcionais
PDF
Programação funcional tipada: uma introdução
PPTX
Java - Visão geral e Exercícios
PDF
Curso java 04 - ap is e bibliotecas
PDF
Curso de Java: Introdução a lambda e Streams
PDF
Functional Programming - Scala
PPTX
Técnicas de Programação Funcional
PDF
PPTX
Código limpo
PDF
01-Paradigmas.pdf
PDF
Functional programming feat. Swift (Portuguese)
PDF
Functional programming for Old Object Oriented Developers
PDF
Minicurso kotlin UTFPR
Aprendendo Kotlin na Prática
Scala - Uma Breve (breve mesmo) Introdução
Scala: Programação OO, Funcional e Concorrente na JVM
Scala java7
Turbinando o desenvolvimento Android com Kotlin
Scala: Linguagem Promissora e Funcional
Kotlin: conhecendo features de uma linguagem moderna
Padrões de projeto em linguagens funcionais
Programação funcional tipada: uma introdução
Java - Visão geral e Exercícios
Curso java 04 - ap is e bibliotecas
Curso de Java: Introdução a lambda e Streams
Functional Programming - Scala
Técnicas de Programação Funcional
Código limpo
01-Paradigmas.pdf
Functional programming feat. Swift (Portuguese)
Functional programming for Old Object Oriented Developers
Minicurso kotlin UTFPR
Anúncio

Último (19)

PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PPTX
Aula 18 - Manipulacao De Arquivos python
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Aula04-Academia Heri- Tecnologia Geral 2025
Processos na gestão de transportes, TM100 Col18
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
COBITxITIL-Entenda as diferença em uso governança TI
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Apple Pippin Uma breve introdução. - David Glotz
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Custos e liquidação no SAP Transportation Management, TM130 Col18
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Aula 18 - Manipulacao De Arquivos python

Scala: unindo programação funcional e orientação a objetos

  • 1. Scala Unindo programação funcional e orientação a objetos Felipe Hummel
  • 2. Quem? • Graduação (2008) e Mestrado (2011) pela UFAM • NewsMonitor • Desde 2012, morando em São Paulo nos últimos 2 anos • Site profissional para monitoramento de notícias em tempo real • 170M de notícias • 5M/mês • ~30K linhas de código Scala (2 Devs back-end) • Maiores desafios estão na coleta, processamento e busca de notícias
  • 3. Scala, o quê? • Relativamente “nova" (2004) começando a ganhar tração depois de 2010 • Linguagem com tipagem forte e estática (“mais" do que outras) • “Multiparadigma”: funcional + OO • Open Source • Compila para bytecode da JVM (Java Virtual Machine) • Facilmente interoperável com código e libs Java
  • 6. Scala, por quê? • Consegue ser roazavelmente familiar mas ainda introduz conceitos funcionais que mudam a forma como programamos • Concisão de código sem perca de legibilidade • Inferência de tipos (local, diferente de Haskell/ML) • Coleções muito ricas em funcionalidades • 90% da rotina é lidar com coleções de objetos • Preferência por imutabilidade • Quase tudo faz parte da biblioteca e não é sintaxe especial da linguagem • Poder para expressar muita coisa
  • 9. Val e Var val soma = 1 + 1

  • 10. Val e Var val soma = 1 + 1
 soma = 10 //error: reassignment to val
  • 11. Val e Var var soma = 1 + 1

  • 12. Val e Var var soma = 1 + 1
 soma = soma + 1 //OK!
  • 13. Inferência de tipos val soma = 1 + 1

  • 14. Inferência de tipos 
 val soma: Int = 1 + 1
 soma.substring(0)
 //error: value substring is not a member of Int
  • 15. Inferência de tipos 
 val soma = 1 + 1
 soma.substring(0)
 //error: value substring is not a member of Int
  • 16. Inferência de tipos val soma: Int = 1 + 1
 val nome: String = “teste"
 val lista: List[String] = List(“teste”)

  • 17. Inferência de tipos val soma = 1 + 1
 val nome = “teste"
 val lista = List(“teste”)

  • 18. Funções 
 def add1(n: Int) = n + 1
 // ^ inferência de tipo de retorno
  • 19. Funções 
 def add1(n: Int): Int = n + 1
 // ^ tipo de retorno explícito
  • 20. Funções 
 def add1(n: Int): Int = { 
 println(“adicionando 1”)
 n + 1 // última expressão: retorno automático
 }

  • 21. Funções anônimas 
 val f = (n: Int) => n + 1 
 // ^ inferindo tipo de retorno
 f(1) // retorna 2
 
 
 val g: (Int => Int) = n => n * 2
 val h: (Int => Int) = _ * 2

  • 22. Funções anônimas 
 val f = (n: Int) => n + 1 
 val g: (Int => Int) = n => n * 2
 
 val fg = f.andThen(g) 
 fg(10) // retorna 22

  • 23. Lazy vals lazy val usuários = todosUsuarios()
 // todosUsuarios() ainda não foi chamada!!
 
 val result = usuarios
 // todosUsuarios() foi chamada agora
 
 println(usuarios)// não precisou recomputar
  • 24. Classes class Curso(id: Int, nome: String)
 class Aluno(id: Int, curso: Curso, idade: Int)
  • 25. Classes // ISSO NÃO É SCALA CORRETO! 
 class Curso {
 private val id: Int
 private val nome: String
 def constructor(_id: Int, _nome: String) {
 id = _id
 nome = _nome
 }
 }
  • 26. Classes // ISSO É SCALA CORRETO! 
 class Curso(id: Int, nome: String)
 
 
 
 

  • 27. Classes 
 
 class Curso(id: Int, nome: String)
 
 val computacao = new Curso(1,“Computação”)
 
 println(computacao.nome) 
 //error: value nome is not a member of Curso
 // nome não é acessível publicamente
  • 28. Classes 
 
 class Curso(val id: Int, val nome: String)
 
 val computacao = new Curso(1,“Computação”)
 
 println(computacao.nome) 
 // Computação

  • 29. Classes 
 
 class Curso(id: Int, nome: String) {
 def comoString(): String =
 s”Curso($id, $nome)“
 }
 
 val computacao = new Curso(1,“Computação”)
 
 println(computacao.comoString()) 
 // Curso(1, Computação)
  • 30. case classes 
 
 
 
 
 case class Curso(id: Int, nome: String)
 
 val computacao = Curso(1,“Computação”)
 
 println(computacao) 
 // Curso(1, Computação)
  • 31. case classes 
 // implementa pra mim:
 // - toString() bonitinho
 // - equals() e hashCode()
 // - atributos são públicos e imutáveis por padrão
 // - não precisa do new para instanciar objeto
 case class Curso(id: Int, nome: String)
 
 val computacao = Curso(1,“Computação”)
 
 println(computacao) 
 // Curso(1, Computação)
  • 32. public class Person {
 private final String firstName;
 private final String lastName; String getFirstName() { return firstName; }
 String getLastName() { return lastName; }
 
 public Person(String first, String last) {
 this.firstName = first;
 this.lastName = last;
 }
 
 public int hashCode() {
 return goodHashCode(firstName, lastName);
 }
 public boolean equals(Object o) {
 if ( this == aThat ) return true;
 if ( !(aThat instanceof Person) ) return false;
 Person that = (Person)aThat;
 return EqualsUtil.areEqual(this.firstName, that.firstName) &
 EqualsUtil.areEqual(this.lastName, that.lastName);
 }
 }
  • 33. case class Person(firstName: String, lastName: String)
  • 34. objects // um "singleton"
 object ContadorGlobal {
 var contador = 0
 def incrementaERetorna() = {
 contador += 1
 contador
 }
 }
 // apesar do exemplo, por favor não criem vars globais :)
 ContadorGlobal.incrementaERetorna() // 1
 ContadorGlobal.incrementaERetorna() // 2
 ContadorGlobal.incrementaERetorna() // 3
 

  • 35. parâmetros de tipo (generics) val cursos: List[String] =
 List(“Computação”, “Matemática”, "Física")
 
 
 val cursosPorNome: Map[String, Int] =
 Map("Computação" -> 1234,
 "Matemática" -> 423,
 "Física" -> 5322,
 "Biologia" -> 1312)

  • 39. 80% de Scala é isso
  • 41. Parar de acessar o que não está lá • NullPointerException (Java) • Segmentation Fault (C/C++) • undefined is not a function (Javascript) • AttributeError: 'NoneType' object has no attribute (Python) • Call to a member function on a non-object (PHP)
  • 42. Parar de acessar o que não está lá • NullPointerException (Java) • undefined is not a function (Javascript) • AttributeError: 'NoneType' object has no attribute (Python) • Call to a member function on a non-object (PHP)
  • 43. Null Pointer Exc… NÃO • NullPointerException (Java) • undefined is not a function (Javascript) • AttributeError: 'NoneType' object has no attribute (Python) • Call to a member function on a non-object (PHP) SCALA NÃO TEM !!!!!!!!!
  • 44. Null Pointer Exc… NÃO • Uso de Option[MeuTipo] quando necessário
  • 45. Tipagem Estática! • Linguagens com tipagem estáticas pegaram fama de serem verbosas • Não necessariamente • Scala consegue ser tão concisa quanto as linguagens dinâmicas • Tendência de adicionar tipos opcionais nas linguagens dinâmicas • Javascript, PHP, Python • Difícil viver sem um compilador me ajudando
  • 46. Imutabilidade • Coisas a menos pra guardar na sua cabeça • Não me preocupo se alguém pode ou vai mudar meu objeto • Você pode passar objetos imutáveis pra lá e pra cá de boa • Thread-safe por padrão
  • 47. Scala é a melhor coisa do mundo?
  • 48. Scala é a melhor coisa do mundo?
  • 50. Mais conciso e expressivo que Scala é impossível
  • 51. Mais conciso e expressivo que Haskell é impossível
  • 52. Programação é sempre um comando seguido do outro
  • 53. Programação pode ser só (funções (chamando (funções ‘!’))) em Clojure
  • 54. Ou damos free() na mão ou usamos Garbage Collector
  • 55. Ou damos free() na mão ou usamos Garbage Collector ou usamos Rust e o seu sistema de ownership
  • 56. Sempre dá pra melhorar