Upload
frederico-maia-arantes
View
248
Download
0
Embed Size (px)
Citation preview
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
Sobre o que iremos falar
• Default Methods
• Lambdas Expressions
• Functional Interfaces
• Streams
• Collectors
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()
}
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
}
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); }
}
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}
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}
Novo loop com forEach
...
ingressos.forEach(consumer); }}
class Impressora implements Consumer<Ingresso> { @Override public void accept(Ingresso ingresso) { System.out.println(ingresso); }}
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); }}
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); }}
Novo loop com forEach
…
Consumer<Ingresso> consumer= new Consumer<Ingresso> {
@Override public void accept(Ingresso ingresso) { System.out.println(ingresso); } };
ingressos.forEach(consumer);
Novo loop com forEach
…
Consumer<Ingresso> consumer= new Consumer<Ingresso> {
@Override public void accept(Ingresso ingresso) { System.out.println(ingresso); }};
ingressos.forEach(consumer);
Novo loop com forEach
…
ingressos.forEach(new Consumer<Ingresso>(){
@Override public void accept(Ingresso ingresso) { System.out.println(ingresso); }});
Novo loop com forEach
…
ingressos.forEach(new Consumer<Ingresso>(){
@Override public void accept(Ingresso ingresso) { System.out.println(ingresso); }});
…
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
…
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
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
Default Methods
São novos métodos da linguagem, com implementação, adicionados às
interfaces Java. Como em Collections e Map.
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.
Lambdas
ingressos.forEach(new Consumer<Ingresso>(){
@Override public void accept(Ingresso ingresso) { System.out.println(ingresso); }});
Lambdas
ingressos.forEach(new Consumer<Ingresso>(){
public void accept(Ingresso ingresso) { System.out.println(ingresso); }});
Lambdas
ingressos.forEach(
public void accept(Ingresso ingresso) { System.out.println(ingresso); });
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.
Os Default Methods que vimos
recebem interfaces que possuem um
único método abstrato.
Essas interfaces receberam um nome
especial: Functional Interfaces.
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.
Functional Interfaces
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e){
System.out.println("click!");
}
});
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.
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);
}
}
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();
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 );
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);
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));
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
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
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());
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());