2. Globalcode – Open4education
@filipeportes
Desenvolvedor FullStack e líder de equipe na
TecSinapse
Mais de 8 anos de XP com dev e arquitetura Java
JUGLeader do GoJava - @gojava
Palestrante em eventos como TDC e JavaOne
LATAM
Como churrasco e tomo cerveja a domicílio em
todo território nacional
3. Globalcode – Open4education
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
4. Globalcode – Open4education
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.
5. Globalcode – Open4education
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());
}
});
}
6. Globalcode – Open4education
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());
});
}
7. Globalcode – Open4education
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. Globalcode – Open4education
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));
}
9. Globalcode – Open4education
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?
10. Globalcode – Open4education
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);
}
11. Globalcode – Open4education
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.
12. Globalcode – Open4education
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.
13. Globalcode – Open4education
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);
}
}
}
14. Globalcode – Open4education
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());
}
15. Globalcode – Open4education
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/
16. Globalcode – Open4education
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.