Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
-
Upload
frederico-maia-arantes -
Category
Technology
-
view
578 -
download
1
Transcript of Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Globalcode – Open4education
Java 8 Afinal onde usamos no dia a dia?
Frederico Maia Arantes Desenvolvedor de Sofware / Instrutor
Globalcode – Open4education
Sobre mim
Frederico Maia Arantes Goiano, atualmente no Rio de Janeiro +7 anos de experiência em desenvolvimento Desenvolvedor de software no LIP da TecSinapse Instrutor de cursos Java na Caelum Estudante - MBA em Engenharia de Software na UFRJ
Globalcode – Open4education
Sobre a palestra
Default Methods Lambdas Expressions Functional Interfaces Streams Collectors
Globalcode – Open4education
Classe ‘Ingresso’ public class Ingresso { private String nomeEvento; private double valor; public Ingresso(String nomeEvento, double valor) { this.nomeEvento = nomeEvento; this.valor = valor; } //getters e setters //toString() }
Globalcode – Open4education
Loop tradicional public static void main(String[] args) { List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0), new Ingresso("Festa 2", 150.0), new Ingresso("Festa 3", 200.0));
for(Ingresso ingresso : ingressos) { System.out.println(ingresso); } }
Globalcode – Open4education
Novo loop com forEach public static void main(String[] args) { List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0), new Ingresso("Festa 2", 150.0), new Ingresso("Festa 3", 200.0));
ingressos.forEach(consumer); //recebe um Consumer //Consumer é uma nova interface do Java 8 com um único método }
Globalcode – Open4education
Novo loop com forEach public static void main(String[] args) { List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0), new Ingresso("Festa 2", 150.0), new Ingresso("Festa 3", 200.0));
Consumer<Ingresso> consumer = new Consumer<Ingresso>() { @Override public void accept(Ingresso ingresso) { System.out.println(ingresso); } }; ingressos.forEach(consumer); //recebe um Consumer }
Globalcode – Open4education
Novo loop com forEach public static void main(String[] args) { List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0), new Ingresso("Festa 2", 150.0), new Ingresso("Festa 3", 200.0));
ingressos.forEach(new Consumer<Ingresso>() { @Override public void accept(Ingresso ingresso) { System.out.println(ingresso); } }); }
Globalcode – Open4education
Remover ingressos caros public static void main(String[] args) { List<Ingresso> ingressos = new ArrayList<>(); ingressos.add(new Ingresso("Festa 1", 100.0)); ingressos.add(new Ingresso("Festa 2", 150.0)); ingressos.add(new Ingresso("Festa 3", 180.0)); ingressos.removeIf(new Predicate<Ingresso>() { @Override public boolean test(Ingresso ingresso) { return ingresso.getValor() > 100; } }); }
Globalcode – Open4education
Default methods
Novos métodos, com implementação, adicionados às interfaces Java, como em Collections e Map. Veja por exemplo o forEach:
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
Outros: removeIf, sort, compare, computeIfPresente. Você pode criar default methods em suas interfaces.
Globalcode – Open4education
Legais os Default Methods!
Mas agora preciso escrever mais código que antes, pra fazer a mesma coisa.
Globalcode – Open4education
Lambdas
O que são? De onde vem? De que se alimentam?
“Simplificando bastante, um lambda no Java é uma maneira mais simples de implementar uma interface que tem um
único método.”
Globalcode – Open4education
Lambdas public static void main(String[] args) { List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0), new Ingresso("Festa 2", 150.0), new Ingresso("Festa 3", 200.0));
ingressos.forEach(new Consumer<Ingresso>() { @Override public void accept(Ingresso ingresso) { System.out.println(ingresso); } }); }
Globalcode – Open4education
Lambdas public static void main(String[] args) { List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0), new Ingresso("Festa 2", 150.0), new Ingresso("Festa 3", 200.0));
ingressos.forEach(new Consumer<Ingresso>() { public void accept(Ingresso ingresso) { System.out.println(ingresso); } }); }
Globalcode – Open4education
Lambdas public static void main(String[] args) { List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0), new Ingresso("Festa 2", 150.0), new Ingresso("Festa 3", 200.0));
ingressos.forEach( { public void accept(Ingresso ingresso) { System.out.println(ingresso); } }); }
Globalcode – Open4education
Lambdas public static void main(String[] args) { List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0), new Ingresso("Festa 2", 150.0), new Ingresso("Festa 3", 200.0));
ingressos.forEach( (Ingresso ingresso) { System.out.println(ingresso); }); }
Globalcode – Open4education
Lambdas public static void main(String[] args) { List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0), new Ingresso("Festa 2", 150.0), new Ingresso("Festa 3", 200.0));
ingressos.forEach( (Ingresso ingresso) -‐> { System.out.println(ingresso) } ); }
Globalcode – Open4education
Lambdas public static void main(String[] args) { List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0), new Ingresso("Festa 2", 150.0), new Ingresso("Festa 3", 200.0));
ingressos.forEach( ingresso -‐> { System.out.println(ingresso) } ); }
Globalcode – Open4education
Lambdas public static void main(String[] args) { List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0), new Ingresso("Festa 2", 150.0), new Ingresso("Festa 3", 200.0));
ingressos.forEach(ingresso -‐> System.out.println(ingresso)); }
Globalcode – Open4education
Functional Interfaces
Interfaces com um único método abstrato. Este é um requisito obrigatório. Exemplo: Consumer. Assim no forEach o compilador sabe o método que deverá ser implementado no lambda. Funciona só em interfaces novas do Java 8? Não. Para as novas, e as suas implementações, temos a anotação opcional @FunctionalInterface.
Globalcode – Open4education
Functional Interfaces
button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e){ System.out.println("clik!"); } }); //Com Lambda button.addActionListener(e -‐> System.out.println("click!"));
Globalcode – Open4education
Streams
Trabalhar com coleções sempre envolve muito código. Em muitas linguagens temos por exemplo um ‘filter’ pra facilitar nossa vida. Forma mais funcional de lidar com coleções.
Globalcode – Open4education
Filtrar da forma tradicional public static void main(String[] args) { List<Ingresso> ingressos = new ArrayList<>(); ingressos.add(new Ingresso("Festa 1", 100.0)); ingressos.add(new Ingresso("Festa 2", 150.0)); ingressos.add(new Ingresso("Festa 3", 180.0)); List<Ingresso> ingressosBaratos = new ArrayList<>(); for(Ingresso ingresso : ingressos) { if(ingresso.getValor() < 120) { ingressosBaratos.add(ingresso); } } }
Globalcode – Open4education
Filtrar com Stream public static void main(String[] args) { List<Ingresso> ingressos = new ArrayList<>(); ingressos.add(new Ingresso("Festa 1", 100.0)); ingressos.add(new Ingresso("Festa 2", 150.0)); ingressos.add(new Ingresso("Festa 3", 180.0)); Stream<Ingresso> stream = ingressos.stream(); }
Globalcode – Open4education
Filtrar com Stream public static void main(String[] args) { List<Ingresso> ingressos = new ArrayList<>(); ingressos.add(new Ingresso("Festa 1", 100.0)); ingressos.add(new Ingresso("Festa 2", 150.0)); ingressos.add(new Ingresso("Festa 3", 180.0)); Stream<Ingresso> stream = ingressos.stream(); stream.filter( i -‐> i.getValor() < 120 ); }
Globalcode – Open4education
Filtrar com Stream public static void main(String[] args) { List<Ingresso> ingressos = new ArrayList<>(); ingressos.add(new Ingresso("Festa 1", 100.0)); ingressos.add(new Ingresso("Festa 2", 150.0)); ingressos.add(new Ingresso("Festa 3", 180.0)); ingressos.stream().filter( i -‐> i.getValor() < 120 ); }
Globalcode – Open4education
Filtrar com Stream public static void main(String[] args) { List<Ingresso> ingressos = new ArrayList<>(); ingressos.add(new Ingresso("Festa 1", 100.0)); ingressos.add(new Ingresso("Festa 2", 150.0)); ingressos.add(new Ingresso("Festa 3", 180.0)); ingressos.stream().filter( i -‐> i.getValor() < 120 ); ingressos.forEach( i -‐> System.out.println(i) ); //imprime Festa 1, Festa 2 e Festa 3 }
Globalcode – Open4education
Filtrar com Stream public static void main(String[] args) { List<Ingresso> ingressos = new ArrayList<>(); ingressos.add(new Ingresso("Festa 1", 100.0)); ingressos.add(new Ingresso("Festa 2", 150.0)); ingressos.add(new Ingresso("Festa 3", 180.0)); ingressos.stream() .filter( i -‐> i.getValor() < 120 ) .forEach( i -‐> System.out.println(i) ); //imprime Festa 1 }
Globalcode – Open4education
Collectors, obtendo a lista public static void main(String[] args) { List<Ingresso> ingressos = new ArrayList<>(); ingressos.add(new Ingresso("Festa 1", 100.0)); ingressos.add(new Ingresso("Festa 2", 150.0)); ingressos.add(new Ingresso("Festa 3", 180.0)); ingressos.stream() .filter( i -‐> i.getValor() < 120 ) .collect(Collectors.toList()); }
Globalcode – Open4education
Collectors, obtendo a lista public static void main(String[] args) { List<Ingresso> ingressos = new ArrayList<>(); ingressos.add(new Ingresso("Festa 1", 100.0)); ingressos.add(new Ingresso("Festa 2", 150.0)); ingressos.add(new Ingresso("Festa 3", 180.0)); List<Ingressos> ingressosBaratos = ingressos.stream() .filter( i -‐> i.getValor() < 120 ) .collect(Collectors.toList()); }