“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?
OBRIGADO!
bruno_vky@live.com
bruno.vky@gmail.com
@bruno_vky

"Streamizando" com sucesso

  • 1.
  • 2.
    ABOUT.ME • Analista DesenvolvedorJava – 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 
  • 3.
    NOS PRIMÓRDIOS... • Desdequando o mundo é mundo, todos usavam Arrays... • int[] numbers = new int[10] {1, 2, 3, ..., 10}; • Mas tudo era complicado... • Cadê redimensionamento? • Cadê dinâmica?
  • 4.
    AÍ SURGIU ACOLLECTION 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... 
  • 5.
    ATÉ SURGIR ALGUNSPROBLEMAS... • 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...
  • 6.
    GOOGLE GUAVA • Java1.6+ • API para manipulação de classes bastante utilizadas • Caching • Concorrência • Processamento de Strings • I/O • Collections!
  • 7.
    GOOGLE GUAVA • Collections2 •Collections2.filter(Collection<E> unfiltered, Predicate<? Super E> predicate) • Começando a trabalhar com conceito de Predicate
  • 8.
    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; });
  • 9.
    CHEGA O JAVA1.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();
  • 10.
    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 }
  • 11.
    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);
  • 12.
    ORDENAÇÃO Desafio: Ordenar todosos jogadores por quantidade de pontos List<Jogador> jogadores = Arrays.asList(...); Stream<Jogador> jogadoresPorPontos = jogadores.stream().sorted( Comparator.comparingInt(Jogador::getPontos).reversed());
  • 13.
    MAP-REDUCE • Desafio: Criaruma lista apenas com o nome dos jogadores • List<Jogador> jogadores = Arrays.asList(...); • Stream<String> nomesDosJogadores = jogadores.stream().map(Jogador::getNome);
  • 14.
    FLAT MAP Desafio: Criaruma 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);
  • 15.
    FLAT MAP Function<Jogador, Stream<Item>>function = j -> j.getItens().stream() .sorted(Comparator.comparing(Item::getNome)); Stream<Item> itensDosJogadores = jogadores.stream().flatMap(function);
  • 16.
    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!
  • 17.
    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());
  • 18.
    MÉTODO TERMINAL? • AStream 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
  • 19.
    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()
  • 20.
    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()
  • 21.
    E PARA ENCERRAR... •forEach!!! List<Jogador> jogadores = Arrays.asList(...); jogadores.forEach(System.out::println); jogadores.stream().forEach(System.out::println);
  • 22.
  • 23.