O documento discute as principais novidades da versão Java 8, incluindo: 1) expressões lambda; 2) interfaces funcionais; 3) Stream API para processamento de dados.
2. Java Last Versions
14/05/2016 Java8 2
Generics
Metadata(Anotation)
Autoboxing
Enumerations
Varargs
Static imports
Java 5 going end of life
in October 2009
Java 6 reached
the end of its supported
life in February 2013
April 2015 when the product
reached the end of
its support lifecycle
Dynamic languages
Strings in switch
try-statement
Diamond operator <>
Catching multiple exception
New file I/O library
JDBC 4.0 support
Improved Web Service
support
synchronization and
compiler performance
optimizations
Tiger Mustang Dolphin “Spider”
3. Java Versions
• Java 9 scheduled for September 2016
• Modularization of the JDK under Project Jigsaw
• Money and Currency API
14/05/2016 Java8 3
4. Java8
• Lambda
• “Na lógica matemática e na ciência da computação, cálculo
lambda é um sistema formal que estuda funções recursivas
computáveis, no que se refere a teoria da computabilidade, e
fenômenos relacionados, como variáveis ligadas e substituição.
Sua principal característica são as entidades que podem ser
utilizadas como argumentos e retornadas como valores de
outras funções.” [Wikipédia]
14/05/2016 Java8 4
5. Java8
• Lambda
• Lambda Expressions foi a maneira escolhida para que a linguagem
Java consiga “simular” a programação funcional.
• “Em ciência da computação, programação funcional é um
paradigma de programação que trata a computação como uma
avaliação de funções matemáticas e que evita estados ou dados
mutáveis. Ela enfatiza a aplicação de funções, em contraste da
programação imperativa, que enfatiza mudanças no estado do
programa.”[Wikipédia]
14/05/2016 Java8 5
6. Java8
• Lambda
• Mas enfim o que é Lamdba Expressino na prática?
• São expressões da Forma:
Entrada -> Saída
( ) -> { }
14/05/2016 Java8 6
7. Java8
• Lambda
(int x, int y) -> {return x + y;};
(int x) -> {return x + x;};
(x) -> {return x + x};
(x) -> x + x;
x -> x + x;
14/05/2016 Java8 7
8. Java8
• Lambda
Onde e como usar Lambda?
Primeiro precisamos entender o que é uma
interface funcional
14/05/2016 Java8 8
9. Java8
• Interface Funcional
• Interface que só tem um método abstrato
• @FuncitionalInterface não é obrigatório, serve para o compilador
alertar se você tentar fazer algo que não é permitido, como
adicionar um novo método abstrato
14/05/2016 Java8 9
10. Java8
• Interface Funcional
• Podemos ter métodos concretos em interfaces a partir do Java 8.
Basta utilizar o modificador default. Eles serão "herdados" por
todos que implementarem essa interface. Esse recurso, chamado
default method, permite evoluir uma interface sem quebrar
compatibilidade.
14/05/2016 Java8 10
11. Java8
• Interface Funcional
• Por que interface funcional é importante para entender lambda?
• Interface funcional lembra função
• Função lembra entrada -> saída
• entrada -> saída lembra lambda
• Onde existir uma interface funcional é possível usar uma
expressão lambda!
• Onde existir uma função é possível chamar essa função a partir de
expressão lambda!
14/05/2016 Java8 11
14. Java8
• Lambda +Interface Funcional
• Até o Java 7 (simplificado)
14/05/2016 Java8 14
Como eu posso cria um objeto de uma interface?
Você não cria, o compilador gera para você uma classe anônima que
implementa a interface MyInterface, e passa essa classe ao método
Diminui a quantidade de código que você precisa criar
15. Java8
• Lambda +Interface Funcional
• Agora com Java 8 (simplificado ainda mais)
14/05/2016 Java8 15
Eu não disse que onde existe uma interface funciona eu posso passar
uma expressão lambda!
16. Java8
• Lambda +Interface Funcional
• Agora com Java 8 (simplificado ainda mais)
14/05/2016 Java8 16
• O compilador cria uma classe anônima que implementa a interface
MyInterface
• Como essa interface é funcional, só tem um método void action(), o
compilador sabe que o código definido aqui ( ) -> são os parâmetros
desse método, e o código definido -> { } é o corpo desse método.
Então você não precisa mais informar isso, o java gera para você.
O que está ocorrendo aqui?
17. Java8
• Lambda +Interface Funcional
• Agora com Java 8 (simplificado ainda mais)
14/05/2016 Java8 17
• Ele pega o método concreto void action() gerado na classe anônima e
passa como parâmetro o que você colocou antes do “->” e coloca no
corpo do método que você colocar depois de “->”
O que está ocorrendo aqui?
18. Java8
• Interface Funcional
• Essa é a “simulação” que o Java 8 faz para incorporar o conceito
de programação funcional
• No final das contas, a JVM continua recebendo um objeto que
implementa uma interface e está chamando o método único dessa
interface, que foi implementado pelo objeto
• Para nós programadores, podemos abstrai esse conceito, dizendo
que: “estamos passando uma função para ser executada”
14/05/2016 Java8 18
19. Java8
• Interface Funcional + Lambda
• Todo o código pode ser simplificado para 1 linha
• Diminui drasticamente a quantidade de código que você precisa
criar
• Para quem não gosta de escrever código, expressões lambda são
um prato cheio
• Sempre que você tiver uma classe anônima que estiver
implementando uma interface funcional, você pode substituir por
uma expressão lambda
• Lambda em Java = simplesmente uma outra forma de instanciar
uma classe anônima
14/05/2016 Java8 19
20. Java8
• Interface Funcional + Lambda
• Inferência de Tipos
• Como só tem 1 método, o compilador consegue saber o tipo dos dados,
não é preciso indicar
14/05/2016 Java8 20
Método Lambda Lambda Simplificado
public int method (int x) (x) ->
{ return x*10;}
(x) -> x*10;
public int method (String x) (x) ->
{ return x.length();}
(x) -> x.length();
public void method
(List<String> x, String y)
(x, y) ->
{ x.add(y);}
(x, y) -> x.add(y);
25. Java8
• Method Reference
14/05/2016 Java8 25
Usando o método com classe anônima:
Usando o método com lambda:
Se a única coisa que a lambda faz é retornar um
método de um objeto, eu posso reescrever isso com method reference:
27. Java8
• Stream API
• API para realizar operações em sequencias sobre dados
• Para fazer transformações comuns em nossas coleções,
contamos agora com uma nova API, o Stream
• Para criar um Stream com os elementos de nossa lista só
precisamos chamar o método defaut stream() adicionado a
interface Collection
14/05/2016 Java8 27
28. Java8
• Stream API
14/05/2016 Java8 28
Principais Métodos da API Stream
mapTo Executa uma transformação 1 para 1
filter Filtra objetos do stream
forEach Executa uma ação em cada elemento do stream
collect Encerra o stream e retorna alguma coisa, dependendo do
que você está passando
29. Java8
• Pacote JAVA.UTIL.FUNCTIONS
• Introduziu um conjunto de interfaces funcionais para a gente
tirar proveito e poder usar as expressões lambda
1. Functions<T, R>
2. Predicate<T>
3. Consumer<T>
4. Supplier<T>
5. BinaryOperator<T>
14/05/2016 Java8 29
30. Java8
• Pacote JAVA.UTIL.FUNCTIONS
• Introduziu um conjunto de interfaces funcionais para a gente tirar
proveito e poder usar as expressões lambda
1. Functions<T, R>
A interface Function serve para fazer transformações.
Na opção abaixo, ela está recebendo uma Pessoa e retornado uma
string (o nome da pessoa)
14/05/2016 Java8 30
31. Java8
• Pacote JAVA.UTIL.FUNCTIONS
• Introduziu um conjunto de interfaces funcionais para a gente tirar
proveito e poder usar as expressões lambda
1. Predicate<T>
Predicado, recebe um objeto e retorna um boolean
14/05/2016 Java8 31
32. Java8
• Pacote JAVA.UTIL.FUNCTIONS
• Introduziu um conjunto de interfaces funcionais para a gente tirar
proveito e poder usar as expressões lambda
1. Consumer<T>
Um consumidor: Recebe um objeto e não retorna nada.
14/05/2016 Java8 32
33. Java8
• Pacote JAVA.UTIL.FUNCTIONS
• Introduziu um conjunto de interfaces funcionais para a gente tirar
proveito e poder usar as expressões lambda
1. Supplier<T>
Um produtor : Recebe nada e retorna um objeto
14/05/2016 Java8 33
34. Java8
• Pacote JAVA.UTIL.FUNCTIONS
• Introduziu um conjunto de interfaces funcionais para a gente tirar
proveito e poder usar as expressões lambda
1. BinaryOperator<T>
Recebe 2 objetos e retorna 1
14/05/2016 Java8 34
36. Java8
• Lambda + Stream + Functions
1. 1 fonte de dados
2. Obtenha um Stream
3. Aplique 1 ou mais operações Intermediárias (que retornam outro
stream)
4. Aplique uma operação terminal
14/05/2016 Java8 36
37. Java8
• Lambda + Stream + Functions
14/05/2016 Java8 37
Imprimir nomes de pessoas com tamanho menor que 6
Java 8:
Até o Java 7:
Fonte de dados:
38. Java8
• Lambda + Stream + Functions
14/05/2016 Java8 38
Java 8: Predicado, recebe um objeto e retorna um boolean
Um consumidor: Recebe um objeto e não retorna nada.
39. Java8
• Lambda + Stream + Functions
14/05/2016 Java8 39
Java 8:
Ou Resumidamente
Ou Ainda
40. Java8
• Lambda + Stream + Functions
14/05/2016 Java8 40
Java 8:
Predicado, recebe um objeto e retorna um boolean
Todo método mapTo é um transformação
recebe o nome n que é uma String e retorna o tamanho
Depois soma tudo.
sum é um "método terminal"
Estou filtrando os nomes que começam com “A”, convertendo os nomes que
foram filtrados anteriormente em um lista de inteiros que corresponde aos
respectivos tamanhos, depois retornando a soma desses tamanhos
41. Java8
• Lambda + Stream + Functions
14/05/2016 Java8 41
Antes do Java 8:
42. Java8
• Exercício Proposto
14/05/2016 Java8 42
Crie uma lista de alunos onde cada aluno possua matrícula, nome e nota.
Percorra essa lista de alunos e imprima a matrícula e o nome dos alunos
com nota >= 7 usando os recursos do Java 8: lambda + stream + functions
43. Java8
• API JAVA.TIME
• Vários Conceitos novos, para cada um tipo de data
14/05/2016 Java8 43
LocalTime Tempo 12:00:00
LocalDate Data 2015-12-12
LocalDateTime Data e tempo 2015-12-12T12:00:00
YearMonth Ano e Mês 2015-12
MonthDay Mês e dia 12-03
Instant representa um instante de
tempo
2015-12-12T12:00:00.000Z
Duration Intervalo de tempo em horas 30.8 seconds
Period Intervalo de tempo em dias 1 year, 2 months, and 3 days
45. Java8
• API JAVA.TIME
14/05/2016 Java8 45
É possível encadear várias chamas. A API é imutável, o objeto original
não muda de valor, novos objeto são criados e retornados
TemporalAdjuster: Classes que serve para fazer vários cálculos de forma
simples, por exemplo, calcular o próximo domingo:
46. Java8
• API JAVA.TIME
14/05/2016 Java8 46
Essa classe serve para medir um intervalo de tempo
em termos de nanossegundos.
Você pode obter essa quantidade
de tempo em diversas unidades chamando métodos como toNanos,
toMillis, getSeconds, etc.
47. Java8
• API JAVA.OI / NIO
14/05/2016 Java8 47
Adição da API stream, você consegue abrir um arquivo
e jogar as linhas em um stream. E a partir desse ponto usar todos os
recursos de stream para processar o arquivo
49. Java8
• CONCURRENCY API
14/05/2016 Java8 49
Um das características das linguagens funcionais: evitam estados
mutáveis e facilitam a criação de aplicações concorrentes
Adição da classe CompletableFuture<T>
1. Fornece métodos não-bloqueantes através de callbacks
2. Suporta lambdas
3. Quantidade bem maior de funcionalidades em relação a Future
4. Podemos fazer encadeamento de métodos e composição.
50. Java8
• CONCURRENCY API
14/05/2016 Java8 50
para executar um lambda do tipo Supplier
deseja executar uma operação em outro CompletableFuture
aplica uma transformação simples através de uma função lambda
thread lance uma exceção, para manipular essa situação
Essa função lambda é o callback que será chamado quando
CompletableFuture terminar seu processamento
51. Java8
• Pictures taken from
• https://pt.wikibooks.org/wiki/Programar_em_C/Makefiles
• https://solidsoft.wordpress.com/category/tricks-tips/
• http://pt.slideshare.net/tomek_k/convention-over-configuration-
maven-3-polyglot-maven-gradle-and-ant
• https://kamaondev.wordpress.com/2013/09/16/porque-voce-deve-
trocar-o-maven-pelo-gradle/
14/05/2016 Java8 51