Rodolfo Ferreira
rodolfoferreira.com.br
rodolfo42
def 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")