Upload
jesuinopower
View
2.419
Download
1
Embed Size (px)
DESCRIPTION
JavaFX 8, Collections e Lambdas
Citation preview
Sobre
● 6 anos de experiência na área● Trabalha na maior empresa FOSS● Entusiasta Open Source ● Líder do JUG Vale● JavaFX desde o início
JavaFX 2
JavaFX 2 é uma biblioteca gráfica com suporte a animações, efeitos, controles de interface, gráficos entre outros...
Java Funcional
“O Java nasceu orientado a objetos, e por toda a parte encontra-se a necessidade de ser funcional”
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○ ...
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
Problemas
● Muito código desnecessário● Necessário conhecer partes da API que não
interessam para definir a ação● Chato...
Exemplo
botao.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent evento) { // Aqui vai meu código de verdade... } });
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”.
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”
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)
Mais sobre Lambdasbutton.setOnAction(e -> algumaCoisa());
new Thread(() -> System.out.println(“Rodando...”));
Array.sort(lista, (n1, n2) -> Integer.compare(n1, n2));
chat.aoReceberMensagem(System.out::println);
Interfaces Funcionais Built-inPara acelerar o desenvolvimento funcional, Java 8 traz
diversas interfaces funcionais no pacote java.util.function
Predicate: Recebe um objeto de tipo T e retorna booleanFunction: Recebe T e retorna U (transforma)Supplier: Cria objetos do tipo TConsumer: Aplica uma função sobre T E muitas outras...
StreamUm 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...
Stream e suas funçõesAs 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)
Agrupando dadosOs 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
Stream
As Collections ganham um novo método chamado stream() que retorna um “stream” dos dados naquela collection (método com implementação default)
….
Refazendo o exemplo anteriorroute.get("/movies/search/genre/:genre/:limit", req -> {
Pattern pattern = compile(req.params().get("genre").toLowerCase());
req.response().end(
movies.stream()
.filter(movie -> pattern.matcher(movie.genre).find())
.map(Movie::toString)
.limit(parseInt(req.params().get("limit")))
.collect(joining(",", "[", "]")));
});
https://github.com/devoxx2014-webperf/movie_buddy/blob/master/src/com/github/forax/moviebuddy/Server.java
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
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
JavaFX 8 e Lambda
Muitas classes do JavaFX já são compatíveis com Lambdas:● Tratamento de Eventos● Cell Factories● Listeners
JavaFX e NashornNashorn é a nova Engine Javascript do Java e é possível escrever aplicações em JavaFX usando
JavaScript!
./jjs -fx SeuScript.js
Melhorias na classe String
Método join na String:
String.join(“ tem ”, “No céu”, “pão?”)
No céu tem pão?