SlideShare uma empresa Scribd logo
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

ODP
TDC2016POA | Trilha Java - Atualizando para Java 8 na prática!
PDF
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
PPT
Spring Capitulo 03
PDF
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
KEY
SPL Datastructures
PDF
Proxy, Man-In-The-Middle e testes
PDF
PHP ao Extremo
PDF
Python Class
TDC2016POA | Trilha Java - Atualizando para Java 8 na prática!
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Spring Capitulo 03
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
SPL Datastructures
Proxy, Man-In-The-Middle e testes
PHP ao Extremo
Python Class

Mais procurados (20)

PDF
Programando em python dicionarios
PDF
JavaScript - De verdade
PPTX
NotORM
TXT
Programa 3
PDF
Introdução ao Respect\Validation (1.0)
PDF
Programação Desktop: Revisão Core Java
PPTX
Estruturas de dados em Python
KEY
PHPubSP Object Calisthenics aplicado ao PHP
PDF
Resolução lista2
PDF
Nossa experiência com TDD
PDF
Criando APIs usando o micro-framework Respect
PDF
Lista Encadeada: Inserção no Início
PDF
Tabela Hash com Lista Encadeada
PDF
Lista duplamente encadeada dinamica
PDF
Object Calisthenics: relaxe e escreva códigos simples
PDF
[SCTI 2011] - CLI: sobrevivendo na linha de comando
PDF
Integração do Flex com PHP através do AMFPHP
PDF
Perl Moderno, dia3
PDF
Hashing enderecamento aberto - operações
PDF
Introdução às Redes Neurais com PHP
Programando em python dicionarios
JavaScript - De verdade
NotORM
Programa 3
Introdução ao Respect\Validation (1.0)
Programação Desktop: Revisão Core Java
Estruturas de dados em Python
PHPubSP Object Calisthenics aplicado ao PHP
Resolução lista2
Nossa experiência com TDD
Criando APIs usando o micro-framework Respect
Lista Encadeada: Inserção no Início
Tabela Hash com Lista Encadeada
Lista duplamente encadeada dinamica
Object Calisthenics: relaxe e escreva códigos simples
[SCTI 2011] - CLI: sobrevivendo na linha de comando
Integração do Flex com PHP através do AMFPHP
Perl Moderno, dia3
Hashing enderecamento aberto - operações
Introdução às Redes Neurais com PHP
Anúncio

Destaque (18)

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

Semelhante a meetup adopting java8 (20)

PDF
Leonardo Zamariola - High Order Functions e Functional Interfaces
PPT
Introdução ao MongoDB
PDF
Java 8 - New Features
DOCX
Java para iniciantes
PPTX
Beljug2010
PDF
PostgreSQL 8.4
PPTX
Palestra Novidades da linguagem C# 6
PDF
Simplificando o Javascrip
PDF
Ecosistema spring a_plataforma_enterprise_jav
PDF
O que mudou no Ruby 1.9
PPT
SQL1eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee.ppt
PDF
Plugins Wordpress
PPTX
Desenvolvendo aplicativos web com o google app engine
PDF
Refactoring like a boss
KEY
Grails: Java produtivo e divertido
PDF
Grails parte 1 - introdução
PDF
Refatoração de código com Capitão Nascimento versão completa
PPT
Módulo 3 - Estrutura sequencial.ppt
PDF
Mini Curso PHP Twig - PHP Conference 2017
Leonardo Zamariola - High Order Functions e Functional Interfaces
Introdução ao MongoDB
Java 8 - New Features
Java para iniciantes
Beljug2010
PostgreSQL 8.4
Palestra Novidades da linguagem C# 6
Simplificando o Javascrip
Ecosistema spring a_plataforma_enterprise_jav
O que mudou no Ruby 1.9
SQL1eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee.ppt
Plugins Wordpress
Desenvolvendo aplicativos web com o google app engine
Refactoring like a boss
Grails: Java produtivo e divertido
Grails parte 1 - introdução
Refatoração de código com Capitão Nascimento versão completa
Módulo 3 - Estrutura sequencial.ppt
Mini Curso PHP Twig - PHP Conference 2017

Último (7)

DOC
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
PDF
Evolução em código: algoritmos genéticos com PHP
PDF
Dos requisitos ao código: como criar código rastreável em PHP
DOC
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
PPTX
Mapeamento de Objeto para Tabela Relacional
PPTX
Curso de Windows 11 resumido na prática.pptx
PDF
apresentacao introducao computacao ead.pdf
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
Evolução em código: algoritmos genéticos com PHP
Dos requisitos ao código: como criar código rastreável em PHP
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
Mapeamento de Objeto para Tabela Relacional
Curso de Windows 11 resumido na prática.pptx
apresentacao introducao computacao ead.pdf

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

  • #7: 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
  • #8: 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
  • #9: 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
  • #10: A sintaxe é diferente, mas em pouco tempo você se habitua e vê o quanto é simples.
  • #11: A sintaxe é diferente, mas em pouco tempo você se habitua e vê o quanto é simples.
  • #12: A sintaxe é diferente, mas em pouco tempo você se habitua e vê o quanto é simples.
  • #13: Com essa crise, remover ingressos caros
  • #15: Com essa crise, remover ingressos caros
  • #16: Stream é outra coleção? Não, ele não guarda os dados.