SlideShare a Scribd company logo
1 of 56
Download to read offline
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

More Related Content

What's hot

Sobrecarga e invocação de métodos - Preparatório Certificação - OCAJP7 - Aula...
Sobrecarga e invocação de métodos - Preparatório Certificação - OCAJP7 - Aula...Sobrecarga e invocação de métodos - Preparatório Certificação - OCAJP7 - Aula...
Sobrecarga e invocação de métodos - Preparatório Certificação - OCAJP7 - Aula...Paulo Henrique Lerbach Rodrigues
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5garux
 
Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3garux
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4garux
 
Membros da Classe - Preparatório Certificação - OCAJP7 - Aula 2 - D
Membros da Classe - Preparatório Certificação - OCAJP7 - Aula 2 - DMembros da Classe - Preparatório Certificação - OCAJP7 - Aula 2 - D
Membros da Classe - Preparatório Certificação - OCAJP7 - Aula 2 - DPaulo Henrique Lerbach Rodrigues
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2garux
 
Introdução às Redes Neurais com PHP
Introdução às Redes Neurais com PHPIntrodução às Redes Neurais com PHP
Introdução às Redes Neurais com PHPOtávio Calaça Xavier
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesOtávio Calaça Xavier
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
Criando APIs usando o micro-framework Respect
Criando APIs usando o micro-framework RespectCriando APIs usando o micro-framework Respect
Criando APIs usando o micro-framework RespectIvan Rosolen
 
PHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsPHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsGuilherme Blanco
 

What's hot (20)

Python 04
Python 04Python 04
Python 04
 
Python 03
Python 03Python 03
Python 03
 
Python 02
Python 02Python 02
Python 02
 
Sobrecarga e invocação de métodos - Preparatório Certificação - OCAJP7 - Aula...
Sobrecarga e invocação de métodos - Preparatório Certificação - OCAJP7 - Aula...Sobrecarga e invocação de métodos - Preparatório Certificação - OCAJP7 - Aula...
Sobrecarga e invocação de métodos - Preparatório Certificação - OCAJP7 - Aula...
 
PHP 7
PHP 7PHP 7
PHP 7
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4
 
Membros da Classe - Preparatório Certificação - OCAJP7 - Aula 2 - D
Membros da Classe - Preparatório Certificação - OCAJP7 - Aula 2 - DMembros da Classe - Preparatório Certificação - OCAJP7 - Aula 2 - D
Membros da Classe - Preparatório Certificação - OCAJP7 - Aula 2 - D
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2
 
Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
 
Python 05
Python 05Python 05
Python 05
 
Introdução às Redes Neurais com PHP
Introdução às Redes Neurais com PHPIntrodução às Redes Neurais com PHP
Introdução às Redes Neurais com PHP
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simples
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
iOS 8 com swift
iOS 8 com swiftiOS 8 com swift
iOS 8 com swift
 
Criando APIs usando o micro-framework Respect
Criando APIs usando o micro-framework RespectCriando APIs usando o micro-framework Respect
Criando APIs usando o micro-framework Respect
 
Python 01
Python 01Python 01
Python 01
 
PHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsPHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object Calisthenics
 

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

Groovy para javeiros - Migração Painless
Groovy para javeiros - Migração PainlessGroovy para javeiros - Migração Painless
Groovy para javeiros - Migração PainlessRafael Farias Silva
 
Beljug2010
Beljug2010Beljug2010
Beljug2010UFPA
 
Desenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVADesenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVAWillian Magalhães
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php segurosDouglas V. Pasqua
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Willian Magalhães
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesDevCamp Campinas
 
Grails: Java produtivo e divertido
Grails: Java produtivo e divertidoGrails: Java produtivo e divertido
Grails: Java produtivo e divertidoLucas Teixeira
 
AspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em JavaAspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em Javaelliando dias
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionaliMasters
 

Similar to Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos! (20)

Java para iniciantes
Java para iniciantesJava para iniciantes
Java para iniciantes
 
Groovy para javeiros - Migração Painless
Groovy para javeiros - Migração PainlessGroovy para javeiros - Migração Painless
Groovy para javeiros - Migração Painless
 
Beljug2010
Beljug2010Beljug2010
Beljug2010
 
Java 07 Entrada Dados
Java 07 Entrada DadosJava 07 Entrada Dados
Java 07 Entrada Dados
 
Desenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVADesenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVA
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 
Java 8 - New Features
Java 8 - New FeaturesJava 8 - New Features
Java 8 - New Features
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php seguros
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Introdução ao Java 5
Introdução ao Java 5Introdução ao Java 5
Introdução ao Java 5
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional Interfaces
 
Grails: Java produtivo e divertido
Grails: Java produtivo e divertidoGrails: Java produtivo e divertido
Grails: Java produtivo e divertido
 
Flutter do zero a publicacao
Flutter do zero a publicacaoFlutter do zero a publicacao
Flutter do zero a publicacao
 
MYSQL - TLBDII
MYSQL - TLBDIIMYSQL - TLBDII
MYSQL - TLBDII
 
AspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em JavaAspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em Java
 
Java8
Java8Java8
Java8
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript Funcional
 
Jdbc e hibernate
Jdbc e hibernateJdbc e hibernate
Jdbc e hibernate
 
Java hidden features
Java hidden featuresJava hidden features
Java hidden features
 

More from Frederico Maia Arantes

The best way to create and deploy web apps with full-stack type safety - Mete...
The best way to create and deploy web apps with full-stack type safety - Mete...The best way to create and deploy web apps with full-stack type safety - Mete...
The best way to create and deploy web apps with full-stack type safety - Mete...Frederico Maia Arantes
 
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...Frederico Maia Arantes
 
Apresentando meteor! Join Community - Goiânia
Apresentando meteor! Join Community - GoiâniaApresentando meteor! Join Community - Goiânia
Apresentando meteor! Join Community - GoiâniaFrederico Maia Arantes
 
Meteor - Nunca foi tão fácil desenvolver pra web e mobile
Meteor - Nunca foi tão fácil desenvolver pra web e mobileMeteor - Nunca foi tão fácil desenvolver pra web e mobile
Meteor - Nunca foi tão fácil desenvolver pra web e mobileFrederico Maia Arantes
 
Introdução a JPA e Hibernate - TDC 2012
Introdução a JPA e Hibernate - TDC 2012Introdução a JPA e Hibernate - TDC 2012
Introdução a JPA e Hibernate - TDC 2012Frederico Maia Arantes
 
Boas práticas com jpa 2 e hibernate flisol 2012
Boas práticas com jpa 2 e hibernate   flisol 2012Boas práticas com jpa 2 e hibernate   flisol 2012
Boas práticas com jpa 2 e hibernate flisol 2012Frederico Maia Arantes
 
Cloud Computing - Java no Google App Engine
Cloud Computing - Java no Google App EngineCloud Computing - Java no Google App Engine
Cloud Computing - Java no Google App EngineFrederico Maia Arantes
 
Visão Geral do Java para Iniciantes - FLISOL 2011
Visão Geral do Java para Iniciantes - FLISOL 2011Visão Geral do Java para Iniciantes - FLISOL 2011
Visão Geral do Java para Iniciantes - FLISOL 2011Frederico Maia Arantes
 
JSF 2 e Primefaces - 4º Encontro Mensal do Gojava
JSF 2 e Primefaces - 4º Encontro Mensal do GojavaJSF 2 e Primefaces - 4º Encontro Mensal do Gojava
JSF 2 e Primefaces - 4º Encontro Mensal do GojavaFrederico Maia Arantes
 

More from Frederico Maia Arantes (13)

The best way to create and deploy web apps with full-stack type safety - Mete...
The best way to create and deploy web apps with full-stack type safety - Mete...The best way to create and deploy web apps with full-stack type safety - Mete...
The best way to create and deploy web apps with full-stack type safety - Mete...
 
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...
 
Apresentando meteor! Join Community - Goiânia
Apresentando meteor! Join Community - GoiâniaApresentando meteor! Join Community - Goiânia
Apresentando meteor! Join Community - Goiânia
 
Meteor - Nunca foi tão fácil desenvolver pra web e mobile
Meteor - Nunca foi tão fácil desenvolver pra web e mobileMeteor - Nunca foi tão fácil desenvolver pra web e mobile
Meteor - Nunca foi tão fácil desenvolver pra web e mobile
 
Java Web Fácil com VRaptor
Java Web Fácil com VRaptorJava Web Fácil com VRaptor
Java Web Fácil com VRaptor
 
Introdução a JPA e Hibernate - TDC 2012
Introdução a JPA e Hibernate - TDC 2012Introdução a JPA e Hibernate - TDC 2012
Introdução a JPA e Hibernate - TDC 2012
 
Boas práticas com jpa 2 e hibernate flisol 2012
Boas práticas com jpa 2 e hibernate   flisol 2012Boas práticas com jpa 2 e hibernate   flisol 2012
Boas práticas com jpa 2 e hibernate flisol 2012
 
Java no Google App Engine - TDC2011
Java no Google App Engine - TDC2011Java no Google App Engine - TDC2011
Java no Google App Engine - TDC2011
 
Minicurso jpa e hibernate
Minicurso jpa e hibernateMinicurso jpa e hibernate
Minicurso jpa e hibernate
 
Cloud Computing - Java no Google App Engine
Cloud Computing - Java no Google App EngineCloud Computing - Java no Google App Engine
Cloud Computing - Java no Google App Engine
 
Visão Geral do Java para Iniciantes - FLISOL 2011
Visão Geral do Java para Iniciantes - FLISOL 2011Visão Geral do Java para Iniciantes - FLISOL 2011
Visão Geral do Java para Iniciantes - FLISOL 2011
 
JSF 2 e Primefaces - 4º Encontro Mensal do Gojava
JSF 2 e Primefaces - 4º Encontro Mensal do GojavaJSF 2 e Primefaces - 4º Encontro Mensal do Gojava
JSF 2 e Primefaces - 4º Encontro Mensal do Gojava
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 

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

  • 1. Java 8 Afinal onde usamos no dia a dia? Frederico Maia Arantes Desenvolvedor de Sofware / Instrutor
  • 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
  • 4. Vai falar o que sobre Java 8?
  • 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.
  • 23. Gostei dos Default Methods!
  • 24. Mas Galvão, a gente está escrevendo mais código.
  • 25. É... eu nem entendi 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 void accept(Ingresso ingresso) { System.out.println(ingresso); } });
  • 28. Lambdas ingressos.forEach(new Consumer<Ingresso>(){ public void accept(Ingresso ingresso) { System.out.println(ingresso); } });
  • 29. Lambdas ingressos.forEach( public void accept(Ingresso ingresso) { System.out.println(ingresso); } );
  • 32. Lambdas ingressos.forEach((Ingresso ingresso) -> { System.out.println(ingresso); } );
  • 34. Lambdas ingressos.forEach( ingresso -> { System.out.println(ingresso); } );
  • 37. Gostei mais das Lambdas do que Default Methods!
  • 38. Mas Galvão, o legal é usar esses recursos juntos.
  • 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.
  • 42. Functional Interfaces button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e){ System.out.println("click!"); } });
  • 44. Gostei, mas vou nem falar mais nada.
  • 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());
  • 55. Esse Java 8 é melhor que o Neymar!