8. Java Funcional
“O Java nasceu orientado a objetos, e por
toda a parte encontra-se a necessidade de
ser funcional”
9. Situações cotidianas
Nem sempre a programação é linear ou
imediata:
○ Realizar animação em uma thread separada;
○ Carregar imagem quando passarem o mouse sobre
o texto;
○ Alertar usuário quando receber mensagem;
○ “Setar flag” no banco de dados quando terminar a
cópia de arquivo
○ ...
10. Solução: Interfaces
Definino ações no Java para quando algo
acontecer:
● Crie uma interface;
● Onde deve ser definido sua ação, tenha um atributo do
tipo dessa interface
● Chame o método do atributo quando acontecer a ação
● Crie implementações dessa interface para definir a sua
ação
11. Problemas
● Muito código desnecessário
● Necessário conhecer partes da API que não
interessam para definir a ação
● Chato...
13. Trabalhando com Collections
● A API de Collections do Java não é difícil,
mas é tediosa…
● Lidar com listas e transformá-las demanda
bastante código;
● Quanto mais código… Mais manutenção e
chances de “bugs”.
14. Exemplo
“Pegue uma lista de objetos “Movie”, filtre por
genero fornecido, limite os resultados de
acordo com um parâmetro, retorne uma lista
com os nomes dos filmes no formato JSON”
18. As expressões Lambdas
Melhorias na sintaxe na hora de definir
implementações das interfaces funcionais*:
botao.setOnAction(e ->{
// Minha ação vai aqui
} );
* Interfaces com um só método sem corpo(não final)
19. Mais sobre Lambdas
button.setOnAction(e -> algumaCoisa());
new Thread(() -> System.out.println(“Rodando...”));
Array.sort(lista, (n1, n2) -> Integer.compare(n1, n2));
chat.aoReceberMensagem(System.out::println);
20. Interfaces Funcionais Built-in
Para acelerar o desenvolvimento funcional, Java 8 traz
diversas interfaces funcionais no pacote java.util.function
Predicate: Recebe um objeto de tipo T e retorna boolean
Function: Recebe T e retorna U (transforma)
Supplier: Cria objetos do tipo T
Consumer: Aplica uma função sobre T
E muitas outras...
21. Stream
Um fluxo de objetos de tipo T:
o1 -> o2 -> o3 -> o4 -> o5 -> o6 -> o7 ….
Podemos aplicar funções sobre esses dados: funções que
fecham o stream ou não, possibilitando encadear
funções...
22. Stream e suas funções
As funções aplicadas ao fluxo de dados são intimamentes ligadas às funções
disponíveis no Java 8:
Métodos do Stream:
map(Function)
filter(Predicate)
peek(Consumer)
forEach(Consumer)
generate(Supplier)
23. Agrupando dados
Os dados do Stream podem ser agrupados através do
método collect
Podemos agrupar os objetos do Stream para um String,
para um map, para um Set.
Muitos collectors já estão prontos na classe java.util.
stream.Collectors
24. Stream
As Collections ganham um novo método
chamado stream() que retorna um “stream”
dos dados naquela collection (método com
implementação default)
….
27. Dica: Explore
Veja códigos escritos na forma tradicional e
reescreva com Lambdas e aprofunde nos
collectors e funções já disponíveis.
Traga programação funcional para sua vida
OO
28. JavaFX 8
JavaFX é parte do Java 8
Não é necessário uma API Externa para usar
JavaFX, só chegar e compilar:
$ javac SuperApp.java
$ java SuperApp