Rodolfo Ferreira
rodolfoferreira.com.brdef soma(a: Int, b: Int) = a + b
soma(1, 1) // 2
(a: Tipo, b: Tipo) => <corpo>
soma
anterior(a: Int, b: Int) => a + b
val numero = 42
val nome: String = "Almeida"
var numero = 426
numero = 1004 // pode
(a: Int) => if(a == 0) "Zero" else "Não-zero"
(a: Int) => { val res: Int = a * 5 res // ← retorno }
def fazAlgoCom(numero: Int, algo: Int => Int) = algo(numero)
fazAlgoCom
é uma função de ordem superior
Int
=> Int
função que recebe um Int e retorna um Int
def somaComDois(a: Int) = a + 2
fazAlgoCom(1, somaComDois) // 3
1 + 2 → 1.+(2)
class Int { def +(x: Int) = ... }Faz uma diferença..
class Pessoa(val esporte: String) { def pratica(algo: String) = algo == esporte }
val rodolfo = new Pessoa("Skydiving")
rodolfo pratica "Skydiving" // true
case class Carro(val placa: String)
new
val meuCarro = Carro("XYZ-1234")
A evolução dos seus POJOs
case class Carro(val placa: String)
public class Carro { private final String placa; public Carro(String placa) { this.placa = placa; } public String placa() { return placa; } }
case class Carro(val placa: String) { def prefixo = placa.substring(0, 3) }
val meuCarro = Carro("RAF-1234")
meuCarro.placa // "RAF-1234" meuCarro.prefixo // "RAF"
val umAteQuatro = List(1, 2, 3, 4)
umAteQuatro
sempre será o mesmo
val umAteCinco = umAteQuatro :+ 5
// List(1, 2, 3, 4, 5)
Pessoa
ValidacaoStrategy
PessoaCollector
Collector
irá colecionar objetos Pessoa
válidos
public class Pessoa { private final String nome; private final String sobreNome;
public Pessoa(String nome, String sobreNome) { this.nome = nome; this.sobreNome = sobreNome; }
public String getNome() { return nome; } public String getSobreNome() { return sobreNome; } }
public interface ValidacaoStrategy { public boolean valida(Pessoa pessoa); }
public class ValidacaoPorNome implements ValidacaoStrategy { @Override public boolean valida(Pessoa pessoa) { return pessoa.getNome() != null && pessoa.getNome().length() > 0; } }
public class PessoaCollector { private ValidacaoStrategy validacaoStrategy; private List<Pessoa> pessoasValidas; public PessoaCollector(ValidacaoStrategy validacaoStrategy) { this.validacaoStrategy = validacaoStrategy; this.pessoasValidas = new ArrayList<Pessoa>(); } public void add(Pessoa pessoa) { if (validacaoStrategy.valida(pessoa)) pessoasValidas.add(pessoa); } public List<Pessoa> getPessoasValidas() { return pessoasValidas; } }
PessoaCollector collector = new PessoaCollector(new ValidacaoPorNome());
Pessoa p1 = new Pessoa("Rodolfo", "Ferreira"); Pessoa p2 = new Pessoa("", "Quevedo");
collector.add(p1); collector.add(p2);
collector.getPessoasValidas().size() == 1
case class Pessoa( nome: String, sobrenome: String )
type PessoaValidator = Pessoa => Boolean
val nomeValidator: PessoaValidator = _.nome.length > 0
val nomeInteiroValidator: PessoaValidator =
_.nome.length > 0
&& _.sobrenome.length > 0
case class PessoaCollector(valida: ValidacaoStrategy) { val pessoasValidas = ArrayBuffer[Pessoa]()
def add(pessoa: Pessoa) = if(valida(pessoa)) pessoasValidas += pessoa }
val collector = PessoaCollector(nomeValidator)
val p1 = Pessoa("Rodolfo", "Ferreira") val p2 = Pessoa("", "Quevedo")
collector add p1 collector add p2
collector.pessoasValidas.length == 1
Double valorTotal = 0d; Double descontoTotal = 0d; for (Produto produto : produtos) { valorTotal += produto.getValor(); if (produto.getValor() > 20.00) { descontoTotal += produto.getValor() * 0.1; } } valorTotal -= descontoTotal;
val valores = produtos map (_.valor)
val valorTotal = valores reduce ((total, valor) => total + valor) val descontoTotal = valores filter (_ > 20.00) map (_ * 0.10) reduce ((total, desconto) => total + desconto)
val total = valorTotal - descontoTotal
apply
object FabricaDeCarros { def apply(placa: String): Carro = new Carro(placa) }
val novoCarro = FabricaDeCarros("XYZ-1234")