SlideShare uma empresa Scribd logo
1 de 19
Meetup GoJava Agosto 2016
Atualização para Java 8
Filipe PortesFilipe Portes
Desenvolvedor FullStack e Líder técnico
@filipeportes
● Desenvolvedor FullStack e líder na TecSinapse
● Mais de 8 anos de XP com dev e arquitetura Java
● Um dos JUGLeaders do GoJava
● Palestrante em eventos como TDC e JavaOne LATAM
● Como churrasco e tomo cerveja a domicílio em toda
grande goiânia
Meetup do GoJava?
● Primeiro encontro mensal! De muitos que vão acontecer a
cada 2 ou 3 meses.
● Temas mais técnicos e mais práticos
● Objetivo de reunir a comunidade e trocar experiências
sobre problemas comuns, novidades, etc
● Todos estão convidados a facilitar um meetup.
Atualização para Java 8
● Lançado mundialmente dia 25/03/2014, 2+ anos
● Principais novidades dessa atualização
– Interfaces Funcionais
– Lambda Expressions
– Default methods
– Api Stream e Collectors
– Nova java.time
– Removal of PermGen
– Melhorias de segurança, Type Annotations, etc...
Fonte: http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html
Functional Interfaces
●
Importante para possibilitar as lambda expressions
●
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.
●
Diversas interfaces que já era utilizadas tornaram-se funcionais
●
Para as novas, e as suas implementações, temos a anotação
opcional @FunctionalInterface.
Sort 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));
Collections.sort(inscricoes, new Comparator<Ingresso>() {
@Override
public int compare(Ingresso o1, Ingresso o2) {
return o1.getNome().compareTo(o2.getNome());
}
});
}
Lambda
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));
Collections.sort(inscricoes, (o1, o2) -> {
return o1.getNome().compareTo(o2.getNome());
});
}
Lambda
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));
Collections.sort(inscricoes, (o1, o2) -> return o1.getNome().compareTo(o2.getNome());
}
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));
}
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));
}
A não ainda é muito código :(
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(System.out::println);
}
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.
Streams & Collectors
Fonte: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html
https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.htm
● Trabalhar com coleções sempre envolve muito código.
● Em muitas linguagens temos por exemplo um ‘filter’ pra facilitar
nossa vida.
● A lib guava tem a FluentIterable com funcionalidades bastante
similares
● Collectors implementa um conjunto de reduções úteis para
trabalhar com coleções como agrupamentos, somatórios e
transformações.
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);
}
}
}
Filtrando com Stream e Collectors
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 = ingressos.stream()
.filter( i -> i.getValor() < 120 )
.collect(Collectors.toList());
}
Nova api java.time
● Inspirada na api joda.time
● Mais facilidade para fazer operações com datas
● Novas classes LocalDate, LocalDateTime, YearMonth,
Year, Month, etc..
● Suporte a fuso horário
● Obter a data de amanhã: LocalDate.now().plusDays(1);
● Calcular um período entre duas datas, como uma idade:
● Period periodo = Period.between(dtNascimento, hoje);
Fonte: http://blog.caelum.com.br/conheca-a-nova-api-de-datas-do-java-8/
OutOfMemoryError: PermGen space?
● Não existe mais o Permanent Generation (PermGen) space
● Metaspace: O novo espaço de memória
● Não precisa verificar e tunar a memória nunca mais!!!
● #SQN
● O metaspace passa a ser limitado pela quantidade de memória
fisica na máquina
● Novo parametro MaxMetaspaceSize para limitar esse uso
● Basicamente: antes era pouco por default, agora é muito por
default
Fonte: https://dzone.com/articles/java-8-permgen-metaspace
https://www.infoq.com/news/2013/03/java-8-permgen-metaspace
Mão na massa
Código: https://github.com/filipeportes/adopting-java8
Obrigado!
● Gojava
– Slack → https://gojavajug.slack.com
– Facebook → https://www.facebook.com/gojava
– Twitter → https://twitter.com/gojava
● Filipe
– Twiiter → https://twitter.com/filipeportes
– Email → omeuefilipe@gmail.com
– GitHub → https://github.com/filipeportes

Mais conteúdo relacionado

Mais procurados

Programando em python dicionarios
Programando em python   dicionariosProgramando em python   dicionarios
Programando em python dicionariossamuelthiago
 
JavaScript - De verdade
JavaScript - De verdadeJavaScript - De verdade
JavaScript - De verdadeLuis Vendrame
 
Programa 3
Programa 3Programa 3
Programa 3yito24
 
Introdução ao Respect\Validation (1.0)
Introdução ao Respect\Validation (1.0)Introdução ao Respect\Validation (1.0)
Introdução ao Respect\Validation (1.0)Henrique Moody
 
Programação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaProgramação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaElaine Cecília Gatto
 
Estruturas de dados em Python
Estruturas de dados em PythonEstruturas de dados em Python
Estruturas de dados em PythonRicardo Paiva
 
PHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPPHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPGuilherme Blanco
 
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
 
Lista Encadeada: Inserção no Início
Lista Encadeada: Inserção no InícioLista Encadeada: Inserção no Início
Lista Encadeada: Inserção no InícioElaine Cecília Gatto
 
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
 
[SCTI 2011] - CLI: sobrevivendo na linha de comando
[SCTI 2011] - CLI: sobrevivendo na linha de comando[SCTI 2011] - CLI: sobrevivendo na linha de comando
[SCTI 2011] - CLI: sobrevivendo na linha de comandoSCTI UENF
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPelliando dias
 
Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3garux
 
Hashing enderecamento aberto - operações
Hashing enderecamento aberto - operaçõesHashing enderecamento aberto - operações
Hashing enderecamento aberto - operaçõesElaine Cecília Gatto
 
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
 

Mais procurados (20)

Programando em python dicionarios
Programando em python   dicionariosProgramando em python   dicionarios
Programando em python dicionarios
 
JavaScript - De verdade
JavaScript - De verdadeJavaScript - De verdade
JavaScript - De verdade
 
NotORM
NotORMNotORM
NotORM
 
Programa 3
Programa 3Programa 3
Programa 3
 
Introdução ao Respect\Validation (1.0)
Introdução ao Respect\Validation (1.0)Introdução ao Respect\Validation (1.0)
Introdução ao Respect\Validation (1.0)
 
Programação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaProgramação Desktop: Revisão Core Java
Programação Desktop: Revisão Core Java
 
Estruturas de dados em Python
Estruturas de dados em PythonEstruturas de dados em Python
Estruturas de dados em Python
 
PHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPPHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHP
 
Resolução lista2
Resolução lista2Resolução lista2
Resolução lista2
 
Nossa experiência com TDD
Nossa experiência com TDDNossa experiência com TDD
Nossa experiência com TDD
 
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
 
Lista Encadeada: Inserção no Início
Lista Encadeada: Inserção no InícioLista Encadeada: Inserção no Início
Lista Encadeada: Inserção no Início
 
Tabela Hash com Lista Encadeada
Tabela Hash com Lista EncadeadaTabela Hash com Lista Encadeada
Tabela Hash com Lista Encadeada
 
Lista duplamente encadeada dinamica
Lista duplamente encadeada dinamicaLista duplamente encadeada dinamica
Lista duplamente encadeada dinamica
 
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
 
[SCTI 2011] - CLI: sobrevivendo na linha de comando
[SCTI 2011] - CLI: sobrevivendo na linha de comando[SCTI 2011] - CLI: sobrevivendo na linha de comando
[SCTI 2011] - CLI: sobrevivendo na linha de comando
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHP
 
Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3
 
Hashing enderecamento aberto - operações
Hashing enderecamento aberto - operaçõesHashing enderecamento aberto - operações
Hashing enderecamento aberto - operações
 
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
 

Destaque

Resultaten serious game who is john galt
Resultaten serious game who is john galtResultaten serious game who is john galt
Resultaten serious game who is john galtRob Oostdam
 
SAPI Solutions for Distribution
SAPI Solutions for DistributionSAPI Solutions for Distribution
SAPI Solutions for DistributionEric Thornell
 
The Street Kids of Calabar: A Punitive Approach is Not Enough
 The Street Kids of Calabar: A Punitive Approach is Not Enough The Street Kids of Calabar: A Punitive Approach is Not Enough
The Street Kids of Calabar: A Punitive Approach is Not EnoughPIND Foundation
 
Client-Side Performance Monitoring (MobileTea, Rome)
Client-Side Performance Monitoring (MobileTea, Rome)Client-Side Performance Monitoring (MobileTea, Rome)
Client-Side Performance Monitoring (MobileTea, Rome)Andrew Rota
 
Iapmei incentivos industria 4.0 apt v4
Iapmei   incentivos industria 4.0 apt v4Iapmei   incentivos industria 4.0 apt v4
Iapmei incentivos industria 4.0 apt v4Pedro Cilínio
 
Doctor, Lawyer, Poker Player, Physicist: The Best Engineers We're Not Competi...
Doctor, Lawyer, Poker Player, Physicist: The Best Engineers We're Not Competi...Doctor, Lawyer, Poker Player, Physicist: The Best Engineers We're Not Competi...
Doctor, Lawyer, Poker Player, Physicist: The Best Engineers We're Not Competi...Carina C. Zona
 
Onde é que nos encontramos para aonde estamos a ir e onde devemos estar
Onde é que nos encontramos para aonde estamos a ir e onde devemos estarOnde é que nos encontramos para aonde estamos a ir e onde devemos estar
Onde é que nos encontramos para aonde estamos a ir e onde devemos estarJorge Moreira
 
専修大学文学部50年小史
専修大学文学部50年小史専修大学文学部50年小史
専修大学文学部50年小史LettersSU
 
Commerce 2.x lessons learned
Commerce 2.x  lessons learnedCommerce 2.x  lessons learned
Commerce 2.x lessons learnedBojan Živanović
 
25 Quotes to Inspire your Operational Excellence Initiatives
25 Quotes to Inspire your Operational Excellence Initiatives25 Quotes to Inspire your Operational Excellence Initiatives
25 Quotes to Inspire your Operational Excellence InitiativesCarla Gregory
 
Nomination de hervé le caignec
Nomination de hervé le caignecNomination de hervé le caignec
Nomination de hervé le caignecLISEA
 
ポケットの中のVR
ポケットの中のVRポケットの中のVR
ポケットの中のVRkazuya noshiro
 

Destaque (18)

Resultaten serious game who is john galt
Resultaten serious game who is john galtResultaten serious game who is john galt
Resultaten serious game who is john galt
 
SAPI Solutions for Distribution
SAPI Solutions for DistributionSAPI Solutions for Distribution
SAPI Solutions for Distribution
 
The Street Kids of Calabar: A Punitive Approach is Not Enough
 The Street Kids of Calabar: A Punitive Approach is Not Enough The Street Kids of Calabar: A Punitive Approach is Not Enough
The Street Kids of Calabar: A Punitive Approach is Not Enough
 
Client-Side Performance Monitoring (MobileTea, Rome)
Client-Side Performance Monitoring (MobileTea, Rome)Client-Side Performance Monitoring (MobileTea, Rome)
Client-Side Performance Monitoring (MobileTea, Rome)
 
Iapmei incentivos industria 4.0 apt v4
Iapmei   incentivos industria 4.0 apt v4Iapmei   incentivos industria 4.0 apt v4
Iapmei incentivos industria 4.0 apt v4
 
Doctor, Lawyer, Poker Player, Physicist: The Best Engineers We're Not Competi...
Doctor, Lawyer, Poker Player, Physicist: The Best Engineers We're Not Competi...Doctor, Lawyer, Poker Player, Physicist: The Best Engineers We're Not Competi...
Doctor, Lawyer, Poker Player, Physicist: The Best Engineers We're Not Competi...
 
DevLOVE仙台の野望
DevLOVE仙台の野望DevLOVE仙台の野望
DevLOVE仙台の野望
 
Par30 led spotlight 12w
Par30 led spotlight 12wPar30 led spotlight 12w
Par30 led spotlight 12w
 
Onde é que nos encontramos para aonde estamos a ir e onde devemos estar
Onde é que nos encontramos para aonde estamos a ir e onde devemos estarOnde é que nos encontramos para aonde estamos a ir e onde devemos estar
Onde é que nos encontramos para aonde estamos a ir e onde devemos estar
 
専修大学文学部50年小史
専修大学文学部50年小史専修大学文学部50年小史
専修大学文学部50年小史
 
Un Kano pour Mammy
Un Kano pour MammyUn Kano pour Mammy
Un Kano pour Mammy
 
Commerce 2.x lessons learned
Commerce 2.x  lessons learnedCommerce 2.x  lessons learned
Commerce 2.x lessons learned
 
25 Quotes to Inspire your Operational Excellence Initiatives
25 Quotes to Inspire your Operational Excellence Initiatives25 Quotes to Inspire your Operational Excellence Initiatives
25 Quotes to Inspire your Operational Excellence Initiatives
 
Los presupuestos públicos en estados y municipios
Los presupuestos públicos en estados y municipiosLos presupuestos públicos en estados y municipios
Los presupuestos públicos en estados y municipios
 
Docker: uma visão geral
Docker: uma visão geralDocker: uma visão geral
Docker: uma visão geral
 
Int64
Int64Int64
Int64
 
Nomination de hervé le caignec
Nomination de hervé le caignecNomination de hervé le caignec
Nomination de hervé le caignec
 
ポケットの中のVR
ポケットの中のVRポケットの中のVR
ポケットの中のVR
 

Semelhante a meetup adopting java8

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
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDBRodrigo Hjort
 
Beljug2010
Beljug2010Beljug2010
Beljug2010UFPA
 
Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Renato Haddad
 
Simplificando o Javascrip
Simplificando o JavascripSimplificando o Javascrip
Simplificando o JavascripMiquéias Amaro
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9Nando Vieira
 
Desenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engineDesenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app enginepugpe
 
Grails: Java produtivo e divertido
Grails: Java produtivo e divertidoGrails: Java produtivo e divertido
Grails: Java produtivo e divertidoLucas Teixeira
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introduçãoJosino Rodrigues
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaEduardo Bregaida
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Luis Gustavo Almeida
 
Mini Curso de Python para Coding Dojo
Mini Curso de Python para Coding DojoMini Curso de Python para Coding Dojo
Mini Curso de Python para Coding DojoFabricio NErdmann
 

Semelhante a meetup adopting java8 (20)

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
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDB
 
Java 8 - New Features
Java 8 - New FeaturesJava 8 - New Features
Java 8 - New Features
 
Java para iniciantes
Java para iniciantesJava para iniciantes
Java para iniciantes
 
Beljug2010
Beljug2010Beljug2010
Beljug2010
 
PostgreSQL 8.4
PostgreSQL 8.4PostgreSQL 8.4
PostgreSQL 8.4
 
Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6
 
Simplificando o Javascrip
Simplificando o JavascripSimplificando o Javascrip
Simplificando o Javascrip
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
MYSQL - TLBDII
MYSQL - TLBDIIMYSQL - TLBDII
MYSQL - TLBDII
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9
 
Plugins Wordpress
Plugins WordpressPlugins Wordpress
Plugins Wordpress
 
Desenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engineDesenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engine
 
Refactoring like a boss
Refactoring like a bossRefactoring like a boss
Refactoring like a boss
 
Grails: Java produtivo e divertido
Grails: Java produtivo e divertidoGrails: Java produtivo e divertido
Grails: Java produtivo e divertido
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introdução
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
PHP Básico - Parte 3
PHP Básico - Parte 3PHP Básico - Parte 3
PHP Básico - Parte 3
 
Mini Curso de Python para Coding Dojo
Mini Curso de Python para Coding DojoMini Curso de Python para Coding Dojo
Mini Curso de Python para Coding Dojo
 

meetup adopting java8

  • 1. Meetup GoJava Agosto 2016 Atualização para Java 8 Filipe PortesFilipe Portes Desenvolvedor FullStack e Líder técnico
  • 2. @filipeportes ● Desenvolvedor FullStack e líder na TecSinapse ● Mais de 8 anos de XP com dev e arquitetura Java ● Um dos JUGLeaders do GoJava ● Palestrante em eventos como TDC e JavaOne LATAM ● Como churrasco e tomo cerveja a domicílio em toda grande goiânia
  • 3. Meetup do GoJava? ● Primeiro encontro mensal! De muitos que vão acontecer a cada 2 ou 3 meses. ● Temas mais técnicos e mais práticos ● Objetivo de reunir a comunidade e trocar experiências sobre problemas comuns, novidades, etc ● Todos estão convidados a facilitar um meetup.
  • 4. Atualização para Java 8 ● Lançado mundialmente dia 25/03/2014, 2+ anos ● Principais novidades dessa atualização – Interfaces Funcionais – Lambda Expressions – Default methods – Api Stream e Collectors – Nova java.time – Removal of PermGen – Melhorias de segurança, Type Annotations, etc... Fonte: http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html
  • 5. Functional Interfaces ● Importante para possibilitar as lambda expressions ● 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. ● Diversas interfaces que já era utilizadas tornaram-se funcionais ● Para as novas, e as suas implementações, temos a anotação opcional @FunctionalInterface.
  • 6. Sort 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)); Collections.sort(inscricoes, new Comparator<Ingresso>() { @Override public int compare(Ingresso o1, Ingresso o2) { return o1.getNome().compareTo(o2.getNome()); } }); }
  • 7. Lambda 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)); Collections.sort(inscricoes, (o1, o2) -> { return o1.getNome().compareTo(o2.getNome()); }); }
  • 8. Lambda 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)); Collections.sort(inscricoes, (o1, o2) -> return o1.getNome().compareTo(o2.getNome()); }
  • 9. 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)); }
  • 10. 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)); } A não ainda é muito código :(
  • 11. 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(System.out::println); }
  • 12. 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.
  • 13. Streams & Collectors Fonte: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.htm ● Trabalhar com coleções sempre envolve muito código. ● Em muitas linguagens temos por exemplo um ‘filter’ pra facilitar nossa vida. ● A lib guava tem a FluentIterable com funcionalidades bastante similares ● Collectors implementa um conjunto de reduções úteis para trabalhar com coleções como agrupamentos, somatórios e transformações.
  • 14. 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); } } }
  • 15. Filtrando com Stream e Collectors 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 = ingressos.stream() .filter( i -> i.getValor() < 120 ) .collect(Collectors.toList()); }
  • 16. Nova api java.time ● Inspirada na api joda.time ● Mais facilidade para fazer operações com datas ● Novas classes LocalDate, LocalDateTime, YearMonth, Year, Month, etc.. ● Suporte a fuso horário ● Obter a data de amanhã: LocalDate.now().plusDays(1); ● Calcular um período entre duas datas, como uma idade: ● Period periodo = Period.between(dtNascimento, hoje); Fonte: http://blog.caelum.com.br/conheca-a-nova-api-de-datas-do-java-8/
  • 17. OutOfMemoryError: PermGen space? ● Não existe mais o Permanent Generation (PermGen) space ● Metaspace: O novo espaço de memória ● Não precisa verificar e tunar a memória nunca mais!!! ● #SQN ● O metaspace passa a ser limitado pela quantidade de memória fisica na máquina ● Novo parametro MaxMetaspaceSize para limitar esse uso ● Basicamente: antes era pouco por default, agora é muito por default Fonte: https://dzone.com/articles/java-8-permgen-metaspace https://www.infoq.com/news/2013/03/java-8-permgen-metaspace
  • 18. Mão na massa Código: https://github.com/filipeportes/adopting-java8
  • 19. Obrigado! ● Gojava – Slack → https://gojavajug.slack.com – Facebook → https://www.facebook.com/gojava – Twitter → https://twitter.com/gojava ● Filipe – Twiiter → https://twitter.com/filipeportes – Email → omeuefilipe@gmail.com – GitHub → https://github.com/filipeportes

Notas do Editor

  1. A interface Consumer é uma boa candidata a ser implementada com Lambda. Já sabemos que forEach recebe um Consumer, o Java tbm sabe disso. Então que tal omitir isso
  2. A interface Consumer é uma boa candidata a ser implementada com Lambda. Já sabemos que forEach recebe um Consumer, o Java tbm sabe disso. Então que tal omitir isso
  3. A interface Consumer é uma boa candidata a ser implementada com Lambda. Já sabemos que forEach recebe um Consumer, o Java tbm sabe disso. Então que tal omitir isso
  4. A sintaxe é diferente, mas em pouco tempo você se habitua e vê o quanto é simples.
  5. A sintaxe é diferente, mas em pouco tempo você se habitua e vê o quanto é simples.
  6. A sintaxe é diferente, mas em pouco tempo você se habitua e vê o quanto é simples.
  7. Com essa crise, remover ingressos caros
  8. Com essa crise, remover ingressos caros
  9. Stream é outra coleção? Não, ele não guarda os dados.