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

meetup adopting java8

  • 1.
    Meetup GoJava Agosto2016 Atualização para Java 8 Filipe PortesFilipe Portes Desenvolvedor FullStack e Líder técnico
  • 2.
    @filipeportes ● Desenvolvedor FullStacke 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 Java8 ● 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 parapossibilitar 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 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)); Collections.sort(inscricoes, new Comparator<Ingresso>() { @Override public int compare(Ingresso o1, Ingresso o2) { return o1.getNome().compareTo(o2.getNome()); } }); }
  • 7.
    Lambda public static voidmain(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 voidmain(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 voidmain(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 voidmain(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 voidmain(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 formatradicional 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 Streame 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.