Palestra apresentada no SENAI em Goiânia, com participação especial do Galvão Bueno. :)
Aniversário de 15 anos do grupo GOJava. Tema: "Java 8 - Afinal onde usamos no dia a dia?".
3. Sobre mim
Frederico Maia Arantes
● 8 anos de experiência em desenvolvimento de software
e mais de 4 anos ministrando treinamentos
● Líder e Desenvolvedor Full Stack na TecSinapse
atuando com Java, Scala, JavaScript (Meteor)
● Cofundador e Instrutor na F7 Academy
● Palestrante em diversos eventos de tecnologia
5. Sobre o que iremos falar
• Default Methods
• Lambdas Expressions
• Functional Interfaces
• Streams
• Collectors
6. 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()
}
7. 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) );
//Percorrer os ingressos e mostrar na tela
}
8. 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);
}
}
9. 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. Interface nova do Java 8
//que possui um único método
}
10. 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. Interface nova do Java 8
//que possui um único método
}
11. Novo loop com forEach
...
ingressos.forEach(consumer);
}
}
class Impressora implements Consumer<Ingresso> {
@Override
public void accept(Ingresso ingresso) {
System.out.println(ingresso);
}
}
12. Novo loop com forEach
...
Consumer<Ingresso> consumer = new Impressora();
ingressos.forEach(consumer);
}
}
class Impressora implements Consumer<Ingresso> {
@Override
public void accept(Ingresso ingresso) {
System.out.println(ingresso);
}
}
13. Novo loop com forEach
...
Consumer<Ingresso> consumer = new Impressora();
ingressos.forEach(consumer);
}
}
class Impressora implements Consumer<Ingresso> {
@Override
public void accept(Ingresso ingresso) {
System.out.println(ingresso);
}
}
14. Novo loop com forEach
…
Consumer<Ingresso> consumer= new Consumer<Ingresso> {
@Override
public void accept(Ingresso ingresso) {
System.out.println(ingresso);
}
};
ingressos.forEach(consumer);
15. Novo loop com forEach
…
Consumer<Ingresso> consumer= new Consumer<Ingresso> {
@Override
public void accept(Ingresso ingresso) {
System.out.println(ingresso);
}
};
ingressos.forEach(consumer);
16. Novo loop com forEach
…
ingressos.forEach(new Consumer<Ingresso>(){
@Override
public void accept(Ingresso ingresso) {
System.out.println(ingresso);
}
});
17. Novo loop com forEach
…
ingressos.forEach(new Consumer<Ingresso>(){
@Override
public void accept(Ingresso ingresso) {
System.out.println(ingresso);
}
});
18. …
List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0),
new Ingresso("Festa 2", 150.0),
new Ingresso("Festa 3", 200.0) );
ingressos.removeIf(predicate);
//Recebe um Predicate. Interface nova do Java 8
//possui um único método que retorna um boolean
Removendo ingressos caros
19. …
List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0),
new Ingresso("Festa 2", 150.0),
new Ingresso("Festa 3", 200.0) );
ingressos.removeIf(predicate);
//Recebe um Predicate. Interface nova do Java 8
//possui um único método que retorna um boolean
Removendo ingressos caros
20. List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0),
new Ingresso("Festa 2", 150.0),
new Ingresso("Festa 3", 200.0) );
ingressos.removeIf(new Predicate<Ingresso>() {
@Override
public boolean test(Ingresso ingresso) {
return ingresso.getValor() > 100;
}
});
Removendo ingressos caros
21. Default Methods
São novos métodos da linguagem, com
implementação, adicionados às
interfaces Java.
Como em Collections e Map.
22. Default methods
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
Outros: removeIf, sort, compare, computeIfPresente.
Podemos criar default methods em nossas interfaces.
39. Lambda é uma maneira mais simples
de implementar uma interface que
tem um único método abstrato.
Simplificando bastante, ao invés de criar
classes anônimas, usamos Lambda.
40. Os Default Methods que vimos
recebem interfaces que possuem um
único método abstrato.
Essas interfaces receberam um nome
especial: Functional Interfaces.
41. Functional Interfaces
• Interfaces com um único método abstrato.
• Exemplo, Consumer do forEach. O compilador sabe o
método que deverá ser implementado no lambda.
• Funciona só em interfaces novas do Java? Não.
• Podemos utilizar a anotação @FunctionalInterface.
45. Streams
• Trabalhar com coleções em Java 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.
46. Filtrar da forma tradicional
List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0),
new Ingresso("Festa 2", 150.0),
new Ingresso("Festa 3", 200.0) );
List<Ingresso> baratos = new ArrayList<>();
for(Ingresso ingresso : ingressos) {
if(ingresso.getValor() < 120) {
baratos.add(ingresso);
}
}
47. Filtrar com Stream
List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0),
new Ingresso("Festa 2", 150.0),
new Ingresso("Festa 3", 200.0) );
Stream<Ingresso> stream = ingressos.stream();
48. Filtrar com Stream
List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0),
new Ingresso("Festa 2", 150.0),
new Ingresso("Festa 3", 200.0) );
Stream<Ingresso> stream = ingressos.stream();
stream.filter( i -> i.getValor() < 120 );
49. Filtrar com Stream
List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0),
new Ingresso("Festa 2", 150.0),
new Ingresso("Festa 3", 200.0) );
ingressos.stream().filter(i->i.getValor() < 120);
50. Filtrar com Stream
List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0),
new Ingresso("Festa 2", 150.0),
new Ingresso("Festa 3", 200.0) );
ingressos.stream().filter(i ->i.getValor()<120);
ingressos.forEach(i -> System.out.println(i));
51. Filtrar com Stream
List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0),
new Ingresso("Festa 2", 150.0),
new Ingresso("Festa 3", 200.0) );
ingressos.stream().filter(i ->i.getValor()< 120);
ingressos.forEach(i -> System.out.println(i));
//imprime Festa 1, Festa 2 e Festa 3
52. Filtrar com Stream
List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0),
new Ingresso("Festa 2", 150.0),
new Ingresso("Festa 3", 200.0) );
ingressos.stream()
.filter(i -> i.getValor() < 120);
.forEach(i -> System.out.println(i));
//imprime Festa 1
53. Filtrar com Stream
List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0),
new Ingresso("Festa 2", 150.0),
new Ingresso("Festa 3", 200.0) );
ingressos.stream()
.filter(i -> i.getValor() < 120);
.collect(Collectors.toList());
54. Filtrar com Stream
List<Ingresso> ingressos = Arrays.asList(
new Ingresso("Festa 1", 100.0),
new Ingresso("Festa 2", 150.0),
new Ingresso("Festa 3", 200.0) );
List<Ingressos> baratos = ingressos.stream()
.filter(i -> i.getValor() < 120);
.collect(Collectors.toList());