O documento apresenta uma palestra sobre as principais novidades da atualização do Java para a versão 8, incluindo interfaces funcionais, lambda expressions, métodos default, Stream API e Collectors, nova API de datas java.time e remoção do PermGen space.
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
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
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
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
A sintaxe é diferente, mas em pouco tempo você se habitua e vê o quanto é simples.
A sintaxe é diferente, mas em pouco tempo você se habitua e vê o quanto é simples.
A sintaxe é diferente, mas em pouco tempo você se habitua e vê o quanto é simples.
Com essa crise, remover ingressos caros
Com essa crise, remover ingressos caros
Stream é outra coleção? Não, ele não guarda os dados.