Upload
bruno-oliveira
View
145
Download
0
Embed Size (px)
DESCRIPTION
Aprendendo a trabalhar com a Stream API do Java 8, para tornar a vida do desenvolvedor Java mais simples na hora de manipular listas.
Citation preview
“STREAMIZANDO” COM SUCESSO
Bruno Oliveira
6º JUGVALE
ABOUT.ME
• Analista Desenvolvedor Java – TRIPEX LABS
• Entusiasta JavaFX
• Autor do livro “JavaFX: Interfaces com qualidade para aplicações Desktop” – Casa
do Código
• Alguns artigos sobre JavaFX... – MundoJ
• Viciado em aprender mais e mais do Java 8
NOS PRIMÓRDIOS...
• Desde quando o mundo é mundo, todos usavam Arrays...
• int[] numbers = new int[10] {1, 2, 3, ..., 10};
• Mas tudo era complicado...
• Cadê redimensionamento?
• Cadê dinâmica?
AÍ SURGIU A COLLECTION API
• Since Java 1.2
• Possui dinâmica!
• É possível adicionar itens a uma lista, e ela vai se expandindo!
• Iteração descomplicada!
• Interface Iterable<E>
• Diversas formas de implementação!
• Lists
• Sets
• Maps
• E o mundo passou a ser melhor! Todos usavam alegremente a Collection API...
ATÉ SURGIR ALGUNS PROBLEMAS...
• Como filtrar uma lista de objetos?
• Como ordenar uma lista?
• Como limitar seu tamanho?
• Como pular alguns objetos da lista?
• Como remover itens diante a uma certa condição?
• Etc...
GOOGLE GUAVA
• Java 1.6+
• API para manipulação de classes bastante utilizadas
• Caching
• Concorrência
• Processamento de Strings
• I/O
• Collections!
GOOGLE GUAVA
• Collections2
• Collections2.filter(Collection<E> unfiltered, Predicate<? Super E> predicate)
• Começando a trabalhar com conceito de Predicate
List<String> nomes = Arrays.asList(“Bruno”, “Henrique”, “Oliveira”, “JUGVale”);
List<String> nomesComMaisDe8Letras = Collections2.filter(nomes,
new Predicate<String>() {
public boolean accept(String str) {
return str != null && str.length() > 8;
});
CHEGA O JAVA 1.8 E A STREAM API
• Operações em listas no estilo funcional
• Uso de map-reduce
• Facilidades sempre sonhadas por desenvolvedores Java
• Uso: novo método da interface List (default method)
• Stream<String> myStream = myList.stream();
EXEMPLIFICANDO...
public class Jogador {
private String nome;
private int pontos;
private List<Item> itens;
// getters e setters omitidos
}
public class Item {
private String nome;
// getters e setters omitidos
}
FILTRAGEM DE DADOS
Desafio: Filtrar todos os jogadores com mais de 100 pontos
List<Jogador> jogadores = Arrays.asList(...);
Stream<Jogador> jogadoresComMaisDe100Pontos = jogadores.stream()
.filter(j -> j.getPontos() > 100);
ORDENAÇÃO
Desafio: Ordenar todos os jogadores por quantidade de pontos
List<Jogador> jogadores = Arrays.asList(...);
Stream<Jogador> jogadoresPorPontos = jogadores.stream().sorted(
Comparator.comparingInt(Jogador::getPontos).reversed());
MAP-REDUCE
• Desafio: Criar uma lista apenas com o nome dos jogadores
• List<Jogador> jogadores = Arrays.asList(...);
• Stream<String> nomesDosJogadores = jogadores.stream().map(Jogador::getNome);
FLAT MAP
Desafio: Criar uma lista de itens dos jogadores. Os itens estarão ordenados por nome.
List<Jogador> jogadores = Arrays.asList(...);
Function<Jogador, Stream<Item>> function = j -> j.getItens().stream()
.sorted(Comparator.comparing(Item::getNome));
Stream<Stream<Item>> itensDosJogadores = jogadores.stream().map(function);
FLAT MAP
Function<Jogador, Stream<Item>> function = j -> j.getItens().stream()
.sorted(Comparator.comparing(Item::getNome));
Stream<Item> itensDosJogadores = jogadores.stream().flatMap(function);
LEGAL, MAS CADÊ O RETORNO?
• Por enquanto, nossas operações estão retornando Stream<T>;
• IMPORTANTE: Stream não armazena valores, apenas trabalha com listas, ou seja,
Stream não é uma Collection nova!
• Para retornar uma List, usamos o método terminal collect!
COLLECTOR
Function<Jogador, Stream<Item>> function = j -> j.getItens().stream()
.sorted(Comparator.comparing(Item::getNome));
Stream<Item> itensDosJogadores = jogadores.stream().flatMap(function);
List<Item> itens = itensDosJogadores.collect(Collectors.toList());
MÉTODO TERMINAL?
• A Stream API possui métodos intermediários e terminais;
• Métodos intermediários = Funções para produzir operações em Collections (stream
pipelines)
• Métodos terminais = Funções para produzir um resultado em cima das operações
intermediárias
ALGUNS OUTROS MÉTODOS...
• Tratamento de Autoboxing e Unboxing:
• mapToInt (IntStream)
• mapToDouble (DoubleStream)
• Comparator.comparingInt (ToIntFunction)
• Comparator.comparingDouble (ToDoubleFunction)
• Métodos terminais em IntStream e DoubleStream
• max()
• sum()
ALGUNS OUTROS MÉTODOS...
• Eliminar itens iguais
• distinct()
• Encontrar o primeiro item que segue na Stream
• findFirst()
• Limitar tamanho da lista
• limit(long maxSize)
• Stream paralela (concorrência)
• parallel()
E PARA ENCERRAR...
• forEach!!!
List<Jogador> jogadores = Arrays.asList(...);
jogadores.forEach(System.out::println);
jogadores.stream().forEach(System.out::println);
DÚVIDAS?