Java 8
Afinal onde usamos no dia a dia?
Frederico Maia Arantes
Desenvolvedor de Sofware / Instrutor
Quem é você?
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
Vai falar o que
sobre Java 8?
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.
Gostei dos Default Methods!
Mas Galvão, a gente está
escrevendo mais código.
É... eu nem entendi
mesmo pra que isso.
Lambdas
O que são ?
De onde vem ?
De que se alimentam ?
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);
}
);
Lambdas
ingressos.forEach(
(Ingresso ingresso) {
System.out.println(ingresso);
}
);
Lambdas
ingressos.forEach((Ingresso ingresso) {
System.out.println(ingresso);
}
);
Lambdas
ingressos.forEach((Ingresso ingresso) -> {
System.out.println(ingresso);
}
);
Lambdas
ingressos.forEach((ingresso) -> {
System.out.println(ingresso);
}
);
Lambdas
ingressos.forEach( ingresso -> {
System.out.println(ingresso);
}
);
Lambdas
ingressos.forEach( ingresso ->
System.out.println(ingresso)
);
Lambdas
ingressos.forEach(i-> System.out.println(i));
Gostei mais das Lambdas
do que Default Methods!
Mas Galvão, o legal é usar
esses recursos juntos.
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!");
}
});
Functional Interfaces
button.addActionListener(e ->
System.out.println("click!")
);
Gostei, mas vou nem falar
mais nada.
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());
Esse Java 8 é melhor
que o Neymar!
Obrigado!
Frederico Maia Arantes
http://fredmaia.com
http://f7academy.com.br

Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!

  • 1.
    Java 8 Afinal ondeusamos no dia a dia? Frederico Maia Arantes Desenvolvedor de Sofware / Instrutor
  • 2.
  • 3.
    Sobre mim Frederico MaiaArantes ● 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
  • 4.
    Vai falar oque sobre Java 8?
  • 5.
    Sobre o queiremos falar • Default Methods • Lambdas Expressions • Functional Interfaces • Streams • Collectors
  • 6.
    Classe ‘Ingresso’ public classIngresso { 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 staticvoid 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 staticvoid 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 comforEach 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 comforEach 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 comforEach ... ingressos.forEach(consumer); } } class Impressora implements Consumer<Ingresso> { @Override public void accept(Ingresso ingresso) { System.out.println(ingresso); } }
  • 12.
    Novo loop comforEach ... 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 comforEach ... 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 comforEach … Consumer<Ingresso> consumer= new Consumer<Ingresso> { @Override public void accept(Ingresso ingresso) { System.out.println(ingresso); } }; ingressos.forEach(consumer);
  • 15.
    Novo loop comforEach … Consumer<Ingresso> consumer= new Consumer<Ingresso> { @Override public void accept(Ingresso ingresso) { System.out.println(ingresso); } }; ingressos.forEach(consumer);
  • 16.
    Novo loop comforEach … ingressos.forEach(new Consumer<Ingresso>(){ @Override public void accept(Ingresso ingresso) { System.out.println(ingresso); } });
  • 17.
    Novo loop comforEach … 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 novosmétodos da linguagem, com implementação, adicionados às interfaces Java. Como em Collections e Map.
  • 22.
    Default methods default voidforEach(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.
  • 23.
  • 24.
    Mas Galvão, agente está escrevendo mais código.
  • 25.
    É... eu nementendi mesmo pra que isso.
  • 26.
    Lambdas O que são? De onde vem ? De que se alimentam ?
  • 27.
    Lambdas ingressos.forEach(new Consumer<Ingresso>(){ @Override public voidaccept(Ingresso ingresso) { System.out.println(ingresso); } });
  • 28.
    Lambdas ingressos.forEach(new Consumer<Ingresso>(){ public voidaccept(Ingresso ingresso) { System.out.println(ingresso); } });
  • 29.
    Lambdas ingressos.forEach( public void accept(Ingressoingresso) { System.out.println(ingresso); } );
  • 30.
  • 31.
  • 32.
    Lambdas ingressos.forEach((Ingresso ingresso) ->{ System.out.println(ingresso); } );
  • 33.
  • 34.
    Lambdas ingressos.forEach( ingresso ->{ System.out.println(ingresso); } );
  • 35.
  • 36.
  • 37.
    Gostei mais dasLambdas do que Default Methods!
  • 38.
    Mas Galvão, olegal é usar esses recursos juntos.
  • 39.
    Lambda é umamaneira 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 Methodsque vimos recebem interfaces que possuem um único método abstrato. Essas interfaces receberam um nome especial: Functional Interfaces.
  • 41.
    Functional Interfaces • Interfacescom 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.
  • 42.
    Functional Interfaces button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ System.out.println("click!"); } });
  • 43.
  • 44.
    Gostei, mas vounem falar mais nada.
  • 45.
    Streams • Trabalhar comcoleçõ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 formatradicional 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());
  • 55.
    Esse Java 8é melhor que o Neymar!
  • 56.