1. JDK 8: Lambda, Jigsaw e novidades
Eder Magalhães
@edermag
www.yaw.com.br
Globalcode
–
Open4education
Saturday, July 7, 12
2. Agenda
Plano B: a evolução do Java;
As novidades do JDK 8;
Projeto Lambda;
Projeto Jigsaw;
Type Annotations;
Planejamento e datas;
Links;
Globalcode
–
Open4education
Saturday, July 7, 12
3. Evolução do Java pós Oracle
Passados 6 anos;
Várias funcionalidades solicitadas;
Qual planejamento para entrega?
Globalcode
–
Open4education
Saturday, July 7, 12
4. Evolução do Java pós Oracle
Passados 6 anos;
Várias funcionalidades solicitadas;
Qual planejamento para entrega?
A decisão foi compartilhada com a comunidade:
Plano A:
JDK 7 completo com previsão para 2012;
Plano B:
JDK 7 com algumas features com previsão para 2011;
JDK 8 com funcionalidades complementares com previsão para o
final de 2012;
Globalcode
–
Open4education
Saturday, July 7, 12
5. A escolha foi o Plano B!
Globalcode
–
Open4education
Saturday, July 7, 12
6. As novidades do JDK 8 (JSR 338)
Projeto Lambda: uma linguagem mais eficiente;
Projeto Jigsaw: suporte a definição de módulos;
Type Annotations;
Conclusão do Projeto Coin;
Nova API para datas no Java;
Globalcode
–
Open4education
Saturday, July 7, 12
7. Projeto Lambda:
Java funcional
Globalcode
–
Open4education
Saturday, July 7, 12
8. Mas afinal...
O que é um Lambda Expression (closure)?
Lambda expression é um bloco de código (função)
anônimo, com declarações e expressões, que pode
ser assinalada a uma variável.
Globalcode
–
Open4education
Saturday, July 7, 12
9. Motivação
Tornar o Java mais eficiente em ambientes
multicore;
Emprega ao Java um modelo de programação
funcional;
Sintaxe mais simples e clara se comparada a
classes anônimas;
Globalcode
–
Open4education
Saturday, July 7, 12
10. Projeto Lambda (JSR 335)
Definição de funções anônimas;
Permite criar referência a métodos;
Interfaces com default methods;
Estipula interfaces funcionais (SAMs);
Mudanças nas bibliotecas do Java (Collection)
para se adequar ao Lambda;
Torna o código mais expressivo;
Globalcode
–
Open4education
Saturday, July 7, 12
11. Tarefa básica: ordernar array em Java
String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"};
Arrays.sort(nomes,
new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
}
);
Globalcode
–
Open4education
Saturday, July 7, 12
12. Tarefa básica: ordernar array em Java
String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"};
Arrays.sort(nomes,
new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
}
);
Globalcode
–
Open4education
Saturday, July 7, 12
13. Tarefa básica: ordernar array em Java
String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"};
Arrays.sort(nomes,
(String s1, String s2) -> s1.compareToIgnoreCase(s2));
Lambda Expression
Globalcode
–
Open4education
Saturday, July 7, 12
14. Ordenando strings com Lambda II
String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"};
Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);
Arrays.sort(nomes, c);
Target typing
Globalcode
–
Open4education
Saturday, July 7, 12
15. Ordenando strings com Lambda III
String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"};
Arrays.sort(nomes, String::compareToIgnoreCase);
Method reference
Globalcode
–
Open4education
Saturday, July 7, 12
16. Functional interfaces
Interfaces com um método, utilizadas em
callback;
Conhecidas anteriormente como SAM Types.
Exemplos:
Comparator
Runnable
ActionListener
FileFilter
PathMatcher
...
Globalcode
–
Open4education
Saturday, July 7, 12
17. Detalhes sobre lambdas expressions
Sintaxe também pode ser usada em return;
Variáveis não precisam ser final;
É possível utilizar target typing para definir
atributos;
Globalcode
–
Open4education
Saturday, July 7, 12
18. Method references
Funcionam como expressions, a diferença é que
não definem o corpo e sim a chamada a um
método qualquer;
Tipos de métodos:
Métodos static;
Um método específico de um determinado
objeto;
Globalcode
–
Open4education
Saturday, July 7, 12
19. As coleções com Lambda
Definem uma forma mais inteligente para
navegar sobre elementos;
Modelo parecido com SQL!
Globalcode
–
Open4education
Saturday, July 7, 12
20. Navegação nos elementos
List<Aluno> alunos = buildAlunos();
//navegar em todos os alunos
for (Aluno a: alunos) {
System.out.println("t"+a);
}
Globalcode
–
Open4education
Saturday, July 7, 12
21. Navegação nos elementos
List<Aluno> alunos = buildAlunos();
//navegar em todos os alunos
for (Aluno a: alunos) {
System.out.println("t"+a);
}
//navegar somente nos aprovados
for (Aluno a: alunos) {
if (a.getNota() > 5) {
System.out.println("t"+a);
}
}
Globalcode
–
Open4education
Saturday, July 7, 12
22. Navegação nos elementos com Lambda
List<Aluno> alunos = buildAlunos();
//navegar em todos os alunos
alunos.forEach(a -> { System.out.println("t" + a); });
//navegar somente nos aprovados
alunos.filter(a -> a.getNota() > 5)
.forEach(a -> { System.out.println("t" + a); });
Globalcode
–
Open4education
Saturday, July 7, 12
23. Interfaces: método com corpo!
A partir de lambda será possível definir um
comportamento default para métodos declarados
em interfaces!
Globalcode
–
Open4education
Saturday, July 7, 12
24. Projeto Jigsaw:
Java modular
Globalcode
–
Open4education
Saturday, July 7, 12
25. Motivação
Java é distribuído monoliticamente;
O rt.jar é grande!
Com Java 7, são quase 20k classes;
Complexidade em lidar com legado (16 anos);
Globalcode
–
Open4education
Saturday, July 7, 12
26. Projeto Jigsaw
Suporte a modularização da linguagem Java;
Tornar o modelo de distribuição e execução do
Java mais eficaz;
Globalcode
–
Open4education
Saturday, July 7, 12
27. Módulo
É formado por um conjunto de classes e
interfaces;
Pode determinar uma versão;
Pode definir um entry-point;
Indica a dependência a outros módulos, se
necessário;
Restringe o acesso;
O módulo é definido em modules-info.java;
Globalcode
–
Open4education
Saturday, July 7, 12
28. Exemplo de módulo
//Arquivo modules-info.java
module yaw.projetos @ 1.0 {
class yaw.projetos.Main; //entry-point
requires yaw.core @ 0.5; //dependência
exports yaw.projetos; //expõe o pacote
}
Globalcode
–
Open4education
Saturday, July 7, 12
29. O build
Compilação: javac -modulepath ...
Novos programas:
jmod > definir biblioteca e realizar instalação
do módulo;
jpkg > distribuição do módulo;
Executar: java -m <modulo>
Globalcode
–
Open4education
Saturday, July 7, 12
30. Vamos experimentar
Demo I:
compilar e executar um módulo simples;
Demo II:
definir relacionamento entre dois módulos;
Demo III:
exemplo de módulo que expõe um service;
Globalcode
–
Open4education
Saturday, July 7, 12
31. O que mais
Os módulos são carregados estaticamente;
Interoperabilidade com OSGI e Maven;
Integração com os IDEs Java;
Globalcode
–
Open4education
Saturday, July 7, 12
32. Type Annotations (JSR 308)
Utilizar anotações em outros trechos do código;
Criar um mecanismo eficiente com regras e
validação de tipos do Java baseado em
anotações. A evolução da idéia implementada
com @Override;
Globalcode
–
Open4education
Saturday, July 7, 12
34. Planejamento de entregas
M1: abril de 2012;
M2: junho de 2012;
...
M6: janeiro de 2013;
GA: setembro de 2013;
Globalcode
–
Open4education
Saturday, July 7, 12
37. Rumores sobre o Java 9
VM auto ajustável (self tuning);
Suporte a Big Data;
Reificação dos tipos genéricos;
Criar um protocolo de meta-objetos para
comunicação com outras linguagens;
Suporte a continuations;
Globalcode
–
Open4education
Saturday, July 7, 12